{ }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); // 길 끝의 가로등은 따로 한 번