整数 a と N が空白区切りで一行に与えられる。 a の累乗 a^0、a^1、a^2、… のうち N 以下のものを、小さい順に一行に一つずつすべて出力せよ。 a^0 = 1 で N ≥ 1 なので、一行目はいつも 1 である。
入力
2 ≤ a ≤ 1,000,000,000、1 ≤ N ≤ 9,000,000,000,000,000(9 × 10^15)
出力
N 以下の a^k を k = 0 から順に、一行に一つずつ
例 1 · stdin
2 100
stdout
1
2
4
8
16
32
64
例 2 · stdin
10 1000
stdout
1
10
100
1000
main.py
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(stdin)
実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。
$ 準備完了
コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。
ほかの言語では?言語別の解答を見る · 8 言語の解答
累乗を毎回計算し直さず、前の値に a を掛けて積み上げれば十分です(p = 1 から始めて p *= a)。 落とし穴は三つ。 ① ^ は累乗ではありません:C・C++・Java・C#・JS・TS の 2 ^ 3 はビット XOR で 1 です。 累乗の演算子は Python・JS・TS の ** だけで、C・C++ は pow、Java Math.pow、C# Math.Pow(どれも double)、Craykon には累乗がないので掛け算の繰り返しで作ります。 ② オーバーフロー:9×10^15 近くの最後の p にもう一度 a(最大 10 億)を掛けると long の範囲(約 9.2×10^18)を超えます。 C・C++・Java・C# はエラーなしに値が回り込み(C・C++ では未定義動作)、65537^4 のような値が 9×10^15 より小さい数になって、余計な行が出ます。 掛ける前に p > N / a で止めるか確かめましょう。 Python の整数はあふれず、JS・TS・Craykon は実数なのであふれる代わりに不正確になりますが、そのときはもう N より大きいので p <= N だけで正しく動きます。 ③ int:2^31 を超えるので C・C++・Java・C# は long(long long)が必要です。
Pythonmain.py · 5 行
a, n = map(int, input().split())p = 1 # a의 0제곱while p <= n: print(p) p *= a # 파이썬 정수는 커져도 넘치지 않는다
JavaScriptmain.js · 5 行
const [a, n] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];// p * a가 2^53을 넘으면 정확하지 않지만, 그때는 이미 n보다 커서 반복이 끝난다for (let p = 1; p <= n; p *= a) out.push(p);console.log(out.join("\n"));
TypeScriptmain.ts · 6 行
import { readFileSync } from "node:fs";const [a, n]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];// p * a가 2^53을 넘으면 정확하지 않지만, 그때는 이미 n보다 커서 반복이 끝난다for (let p = 1; p <= n; p *= a) out.push(p);console.log(out.join("\n"));
JavaMain.java · 17 行
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long a = sc.nextLong(), n = sc.nextLong(); StringBuilder out = new StringBuilder(); long p = 1; while (true) { out.append(p).append('\n'); // p * a는 long도 넘칠 수 있다 → 곱하기 전에 나눗셈으로 확인 if (p > n / a) break; p *= a; } System.out.print(out); }}
C#Main.cs · 18 行
using System;class Program{ static void Main() { string[] t = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); long a = long.Parse(t[0]), n = long.Parse(t[1]); long p = 1; while (true) { Console.WriteLine(p); // p * a는 long도 넘칠 수 있다(C#은 기본이 unchecked라 조용히 돈다) → 곱하기 전에 확인 if (p > n / a) break; p *= a; } }}
C++main.cpp · 13 行
#include <iostream>int main() { long long a, n; std::cin >> a >> n; long long p = 1; while (true) { std::cout << p << '\n'; // p * a는 long long도 넘칠 수 있다 → 곱하기 전에 나눗셈으로 확인 if (p > n / a) break; p *= a; }}
Cmain.c · 14 行
#include <stdio.h>int main(void) { long long a, n; scanf("%lld %lld", &a, &n); long long p = 1; for (;;) { printf("%lld\n", p); /* p * a는 long long도 넘칠 수 있다 → 곱하기 전에 나눗셈으로 확인 */ if (p > n / a) break; p *= a; } return 0;}
Craykonmain.cray · 10 行
수들 = コンソール.数読み();a = 수들[0];n = 수들[1];// 크레이콘 수는 실수라 넘치지 않는다. 2^53을 넘으면 정확하지 않지만 그때는 이미 n보다 크다p = 1;間 (p <= n){ コンソール.書く(p); p *= a;}