2010年3月9日 星期二

Problem 382 Perfection,完美數

此題輸入一 n 值,求出此 n 值是否為完美數,而完美數則是將數值所有的因數(不包含本身)相加後,看與原本數值比較大小,若相等即為完美數;若因數總和比較大,則為 ABUNDANT 數;若因數總和比較小,則為 DEFICIENT 數。

舉個例子算出因數總和。數值為 12,12 = 22*31,因數 2 有0、1、2次方項,而 3 有0、1次方項。則(20+21+22) * (30+31) = 28,但因為 28 是所有因數總和,所以須減去本身數值,則結果為 16,與 12 相較之下,數值 12 為 ABUNDANT 數。

以下為此題關鍵程式碼:
while (1)
{
scanf("%d", &input[len]);
len ++;
if (input[len - 1] == 0) break;
}
printf("PERFECTION OUTPUT\n");
for (j = 0; j < len - 1; j ++)
{
n = input[j];
int total = 1, n1 = n;
for( i = 2 ; i < n1; i++ )
{
int isFactor = 0, add = 1, count = 1;
while ( n % i == 0 && n != 0)
{
n /= i;
add += pow(i, count);
count ++;
isFactor = 1;
}
if (isFactor)
total *= add;
}
if (total - n1 < n1)
printf("%5d DEFICIENT\n", n1);
else if (total - n1 == n1)
printf("%5d PERFECT\n", n1);
else
printf("%5d ABUNDANT\n", n1);
}
printf("END OF OUTPUT\n");

By David.K

p382題目連結
回ACM題庫目錄
回首頁

沒有留言: