《算法競賽入門經典》5.42 題:給定 n (2≤n≤100),將 n! 分解為素因子乘積,按素數從小到大輸出各指數。如 5! = 120 = 2^3·3^1·5^1 → 輸出 3 1 1(2,3,5 的指數)。忽略最大素因子之後的素數(否則尾部無限個 0)。
n! = 1×2×3×…×n。每個數分解質因子,指數累加即得 n! 的質因子分解。利用 a^m × a^n = a^(m+n),只需統計每個素數在 1..n 中出現的總次數。
p[25]={0}。p[idx]++。maxp,輸出 p[0..maxp]。#include <stdio.h>
#include <string.h>
int is_prime(int n) {
for (int i = 2; i*i <= n; i++) if (n%i==0) return 0;
return n > 1;
}
int prime[100], pcnt = 0;
int main() {
for (int i = 2; i <= 100; i++) if (is_prime(i)) prime[pcnt++] = i;
int n, p[100];
while (scanf("%d", &n) == 1) {
printf("%d! =", n);
memset(p, 0, sizeof(p));
int maxp = 0;
for (int i = 2; i <= n; i++) {
int m = i;
for (int j = 0; j < pcnt; j++) {
while (m % prime[j] == 0) {
m /= prime[j];
p[j]++;
if (j > maxp) maxp = j;
}
}
}
for (int i = 0; i <= maxp; i++) printf(" %d", p[i]);
printf("\n");
}
return 0;
}
輸入:
5
53
輸出:
5! = 3 1 1
53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
對應素數:2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53(53 以內 16 個素數)。
素數 p 在 n! 中指數 = ⌊n/p⌋ + ⌊n/p^2⌋ + ⌊n/p^3⌋ + …。對大 n(如 10^7)極其高效,但 n≤100 直接模擬足夠。