不超过的乘方
一行给出整数 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 起依次每行一个
2 100
1 2 4 8 16 32 64
10 1000
1 10 100 1000
一行给出整数 a 和 N,以空格分隔。
把 a 的乘方 a^0、a^1、a^2、… 中不超过 N 的全部按从小到大每行一个输出。
因为 a^0 = 1 且 N ≥ 1,第一行总是 1。
2 100
1 2 4 8 16 32 64
10 1000
1 10 100 1000
运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。
$ 就绪
请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。
不必每次重新计算乘方,把前一个值乘以 a 累积下去即可(从 p = 1 开始,p *= a)。
三个陷阱。
① ^ 不是乘方:在 C、C++、Java、C#、JS、TS 中 2 ^ 3 是按位异或,结果是 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)。
a, n = map(int, input().split())p = 1 # a의 0제곱while p <= n: print(p) p *= a # 파이썬 정수는 커져도 넘치지 않는다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"));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"));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); }}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; } }}#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; }}#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;}수들 = 控制台.读数字();a = 수들[0];n = 수들[1];// 크레이콘 수는 실수라 넘치지 않는다. 2^53을 넘으면 정확하지 않지만 그때는 이미 n보다 크다p = 1;当 (p <= n){ 控制台.输出(p); p *= a;}