$n$ 是 合成數 質因數分解後互質的各項相加,因為: $$begin{aligned}
&lcm(a,b) = {a times bover gcd(a,b)}\\
&gcd(a,b) = 1\\
&lcm(a,b) = a times b
end{aligned}$$
如果 $a$ 和 $b$ 都大於$1$的話,$a times b > a + b$ ,所以相加比都乘在一起小。
int prime[N]; bool notPrime[N] = { true, true }; int(); intmain() { int Case = 0, n, p; p = getPrime();
while (scanf("%d", &n) != EOF&&n) { Case++;
if (n == INT_MAX)//2147483647 is prime printf("Case %d: 2147483648n", Case);//2147483647 + 1 elseif (n == 1) printf("Case %d: 2n", Case); else { int sum = 0, m = n; for (int i = 0; i < p&&prime[i] <= n; i++) { //質因數分解 int count = 1; while (!(n%prime[i])) { count *= prime[i]; n /= prime[i]; }
//相加各項 if (count != 1) sum += count; }
if (sum == m)//本身就是質數,和為 1 + n sum++; elseif (n != 1)//剩下的質數 sum += n;
printf("Case %d: %dn", Case, sum); } } return0; } int() { int count = 0; for (int i = 2; i < N; i++) if (!notPrime[i]) { prime[count++] = i; for (int j = i << 1; j < N; j += i) notPrime[j] = true; }
近期评论