{ }codelper
倒序循环步长循环连接输出P0024

跳着倒数

给出整数 n 和 s。
从 n 开始每次减 s,只把大于等于 1 的数输出在一行里。
数与数之间各放一个空格,行首不放空格。
例如 n = 10, s = 3 输出 10 7 4 1,n = 10, s = 5 输出 10 5(不输出 0)。

输入
1 ≤ s ≤ n ≤ 10,000
输出
一行
样例 1 · stdin
10 3
stdout
10 7 4 1
样例 2 · stdin
10 5
stdout
10 5
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

陷阱是在哪里停下。
Python 的 range(n, 0, -s) 不含终点 0,所以能到 1;写成 range(n, 1, -s) 即使正好到 1 也会漏掉 1。
C 系的 for (i = n; i >= 1; i -= s) 如果写成 i >= 0,n 是 s 的倍数时会输出 0。
如果先算次数再循环,个数是 (n - 1) / s + 1 而不是 n / s(10 3 有 4 个)。
空格只放在中间:每个数前面都加 " " 会让行以空格开头而判错(本评测只宽容行尾空格)。
多数语言有连接工具:Python " ".join(...) 或 print(*range(n, 0, -s)),JS/TS 数组.join(" "),Java StringJoiner、String.join,C# string.Join(" ", …)。
C 和 C++(C++23 之前)没有顺手的工具,要自己写“不是第一个数就先输出空格”。
Craykon 和 C 一样,用 控制台.接着输出(…) 不换行地输出,最后用 控制台.输出("") 换行(也可以收集到列表再 列表.连接(" ")),倒着走的循环是 循环 (i = n; i >= 1; i -= s)。

Pythonmain.py · 3 行
n, s = map(int, input().split())# range(시작, 끝, 걸음): 끝(0)은 들어가지 않는다 → 1까지print(" ".join(str(i) for i in range(n, 0, -s)))
JavaScriptmain.js · 4 行
const [n, s] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];for (let i = n; i >= 1; i -= s) out.push(i);console.log(out.join(" "));
TypeScriptmain.ts · 5 行
import { readFileSync } from "node:fs";const [n, s]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];for (let i = n; i >= 1; i -= s) out.push(i);console.log(out.join(" "));
JavaMain.java · 12 行
import java.util.Scanner;import java.util.StringJoiner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt(), s = sc.nextInt();        StringJoiner out = new StringJoiner(" ");        for (int i = n; i >= 1; i -= s) out.add(String.valueOf(i));        System.out.println(out);    }}
C#Main.cs · 14 行
using System;using System.Collections.Generic; class Program{    static void Main()    {        int[] v = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        int n = v[0], s = v[1];        var out_ = new List<int>();        for (int i = n; i >= 1; i -= s) out_.Add(i);        Console.WriteLine(string.Join(" ", out_));    }}
C++main.cpp · 12 行
#include <iostream> int main() {    std::ios::sync_with_stdio(false);    int n, s;    std::cin >> n >> s;    for (int i = n; i >= 1; i -= s) {        if (i != n) std::cout << ' ';        std::cout << i;    }    std::cout << "\n";}
Cmain.c · 12 行
#include <stdio.h> int main(void) {    int n, s;    scanf("%d %d", &n, &s);    for (int i = n; i >= 1; i -= s) {        if (i != n) putchar(' ');   /* 사이에만 빈칸: 첫 수 앞에는 없음 */        printf("%d", i);    }    putchar('\n');    return 0;}
Craykonmain.cray · 12 行
v = 控制台.读数字();n = v[0];s = v[1];循环 (i = n; i >= 1; i -= s){    如果 (i != n)    {        控制台.接着输出(" ");    }    控制台.接着输出(i);}控制台.输出("");