2026年 02月 27日
[ChatGPT] Python 学習 の 手助け (2) [他言語] (2/27)
def prime_factorization(n, spf):
"""spf (smallest prime factor) を使って素因数分解"""
factors = {}
while n > 1:
p = spf[n]
factors[p] = factors.get(p, 0) + 1
n //= p
return factors
def build_spf(limit):
"""各数の最小素因数を求める(高速)"""
spf = list(range(limit + 1))
for i in range(2, int(limit**0.5) + 1):
if spf[i] == i: # iが素数
for j in range(i * i, limit + 1, i):
if spf[j] == j:
spf[j] = i
return spf
limit = 999
spf = build_spf(limit)
for i in range(1, limit + 1):
if i == 1:
print("1 = 1")
continue
factors = prime_factorization(i, spf)
factor_str = " × ".join(
f"{p}^{e}" if e > 1 else f"{p}"
for p, e in sorted(factors.items())
)
print(f"{i} = {factor_str}")
1 = 1■ C言語で書くと、
2 = 2
3 = 3
4 = 2^2
5 = 5
6 = 2 × 3
7 = 7
8 = 2^3
9 = 3^2
10 = 2 × 5
11 = 11
12 = 2^2 × 3
13 = 13
14 = 2 × 7
15 = 3 × 5
16 = 2^4
17 = 17
18 = 2 × 3^2
:
999 = = 3^3 × 37
#include <stdio.h>
void build_spf(int limit, int spf[]) {
for (int i = 0; i <= limit; i++)
spf[i] = i;
for (int i = 2; i * i <= limit; i++) {
if (spf[i] == i) {
for (int j = i * i; j <= limit; j += i) {
if (spf[j] == j)
spf[j] = i;
}
}
}
}
void prime_factorization(int n, int spf[]) {
while (n > 1) {
int p = spf[n];
int count = 0;
while (n % p == 0) {
n /= p;
count++;
}
if (count == 1)
printf("%d", p);
else
printf("%d^%d", p, count);
if (n > 1)
printf(" × ");
}
}
int main() {
int limit = 999;
int spf[1000];
build_spf(limit, spf);
for (int i = 1; i <= limit; i++) {
if (i == 1) {
printf("1 = 1\n");
continue;
}
printf("%d = ", i);
prime_factorization(i, spf); // iがそれ以下の素数で因数分解できるか
printf("\n");
}
return 0;
}
void prime_factorization(int n, int spf[]) {
while (n > 1) {
int p = spf[n];
int count = 0;
void prime_factorization(int n, int spf[]) {
while (n > 1) {
int p = spf[n]; // p はループ内で毎回初期化(ただし、n が関数内で変化するので、spf[0],spf[1]...と変化する
int count = 0; // count もループ内で毎回初期化 while (n % p == 0) {
n /= p; // n は関数の引数だが値をスタック上に持っており、書換えてワーク変数として使っている
