長さ 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
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(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); // 길 끝의 가로등은 따로 한 번