{ }codelper
步长循环P0371

路的尽头也要立的路灯

要在一条长 L 米的散步道上立路灯。
在路的起点(0 米处)立第一盏路灯,从那里起每隔 s 米立一盏。
路的尽头(L 米处)即使不合间隔,也一定要立一盏路灯。
同一个地点不会立两盏路灯。
一行给出 L 和 s,用一个空格隔开。
请按从近到远的顺序,每行一个,输出每盏路灯离起点多少米。
例如 L = 10、s = 3 时是 0、3、6、9、10,L = 10、s = 5 时是 0、5、10。

输入
1 ≤ L ≤ 1,000,1 ≤ s ≤ 1,000(均为整数)。
s 可能比 L 大
输出
每盏路灯的位置占一行,从小到大。
不写单位,只写数字
样例 1 · stdin
10 3
stdout
0
3
6
9
10
样例 2 · stdin
10 5
stdout
0
5
10
main.py
输入(stdin)

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

$ 就绪

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

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

按固定步长跳着走的循环,各语言写法不同。
Python 写 for x in range(0, L, s),不包含终点(L)。
C、C++、Java、C#、JS、TS 写 for (x = 0; x < L; x += s),Craykon 写 循环 (x = 0; x < L; x += s)。
这样只走到 L 之前,再输出一次 L,终点就既不会重复也不会漏掉。
陷阱一:循环到 x <= L,然后又输出一次 L,当 L 是 s 的倍数时终点会出现两次(例 2 变成 0 5 10 10)。
陷阱二:像 range(0, L + 1, s) 那样只是走到终点,却不另外输出 L,当 L 不是 s 的倍数时就漏掉了尽头的路灯(例 1 变成 0 3 6 9)。
陷阱三:不按位置而按次数来数,在 i < L / s 期间输出 i * s,这种写法在不同语言里结果不同。
C、C++、Java、C# 中整数之间的 / 只留下商,10 / 3 是 3,只在 i 为 0、1、2 时循环,于是漏掉 9(例 1 变成 0 3 6 10)。
JS、TS、Craykon 的 / 会除到 3.333…,i 为 3 时也循环,结果正确。
Python 的 range(L / s) 不接受小数,会因 TypeError 停止,改成 range(L // s) 后和 C 一样漏掉 9。

Pythonmain.py · 5 行
L, s = map(int, input().split())# range(0, L, s)는 0부터 s씩 건너뛰며, 끝(L)은 넣지 않는다for x in range(0, L, s):    print(x)print(L)   # 길 끝의 가로등은 따로 한 번
JavaScriptmain.js · 8 行
const [L, s] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];// x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다for (let x = 0; x < L; x += s) {  out.push(x);}out.push(L); // 길 끝의 가로등은 따로 한 번console.log(out.join("\n"));
TypeScriptmain.ts · 9 行
import { readFileSync } from "node:fs";const [L, s]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];// x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다for (let x = 0; x < L; x += s) {  out.push(x);}out.push(L); // 길 끝의 가로등은 따로 한 번console.log(out.join("\n"));
JavaMain.java · 13 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int L = sc.nextInt(), s = sc.nextInt();        // x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다        for (int x = 0; x < L; x += s) {            System.out.println(x);        }        System.out.println(L);   // 길 끝의 가로등은 따로 한 번    }}
C#Main.cs · 16 行
using System; class Program{    static void Main()    {        string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int L = int.Parse(parts[0]), s = int.Parse(parts[1]);        // x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다        for (int x = 0; x < L; x += s)        {            Console.WriteLine(x);        }        Console.WriteLine(L);   // 길 끝의 가로등은 따로 한 번    }}
C++main.cpp · 11 行
#include <iostream> int main() {    int L, s;    std::cin >> L >> s;    // x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다    for (int x = 0; x < L; x += s) {        std::cout << x << "\n";    }    std::cout << L << "\n";   // 길 끝의 가로등은 따로 한 번}
Cmain.c · 12 行
#include <stdio.h> int main(void) {    int L, s;    if (scanf("%d %d", &L, &s) != 2) return 0;    /* x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다 */    for (int x = 0; x < L; x += s) {        printf("%d\n", x);    }    printf("%d\n", L);   /* 길 끝의 가로등은 따로 한 번 */    return 0;}
Craykonmain.cray · 9 行
nums = 控制台.读数字();L = nums[0];s = nums[1];// x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다循环 (x = 0; x < L; x += s){    控制台.输出(x);}控制台.输出(L); // 길 끝의 가로등은 따로 한 번