2.5 完全數(shù)
正整數(shù)n的所有小于n的不同正因數(shù)之和若等于n本身,稱(chēng)數(shù)n為完全數(shù)。
例如,6的正因數(shù)為1,2,3,而6=1=2+3,則6是一個(gè)完全數(shù)。
試求指定區(qū)域內(nèi)的完全數(shù)。
1、算法分析
對(duì)指定區(qū)域中的每一個(gè)數(shù)A實(shí)施窮舉判別。根據(jù)完全數(shù)的定義,為了判別正數(shù)A是不是完全數(shù),用試商法找出A的所有小于A的因數(shù)K。顯然,1<=K<=A/2。注意到1是任何整數(shù)的因數(shù),先把因數(shù)1確定下來(lái),即因數(shù)和S賦初值1,然后設(shè)置K從2到A/2的循環(huán),由表達(dá)式A/K判別K是否是A的因數(shù),并求出A的因數(shù)累加和S。最后若滿(mǎn)足條件A=S說(shuō)明A是完全數(shù),作打印輸出。把n的因數(shù)從1開(kāi)始,由小到大排列,寫(xiě)成和式。
程序代碼如下:
#include
void main()
{
int a,s,k;
int n=0;
printf("(2,10000)中的完全數(shù): ");
for(a=2;a<=10000;a++)
{
s=1;
for(k=2;k<=a/2;k++)
if((float)a/k==a/k) s=s+k;
if(s!=a)goto A;
n=n+1;
printf("%d:%d=1",n,a);
for(k=2;k<=a/2;k++)
if((float)a/k==a/k)printf("+ %d",k);
printf("\n");
A:;
}
}
正整數(shù)n的所有小于n的不同正因數(shù)之和若等于n本身,稱(chēng)數(shù)n為完全數(shù)。
例如,6的正因數(shù)為1,2,3,而6=1=2+3,則6是一個(gè)完全數(shù)。
試求指定區(qū)域內(nèi)的完全數(shù)。
1、算法分析
對(duì)指定區(qū)域中的每一個(gè)數(shù)A實(shí)施窮舉判別。根據(jù)完全數(shù)的定義,為了判別正數(shù)A是不是完全數(shù),用試商法找出A的所有小于A的因數(shù)K。顯然,1<=K<=A/2。注意到1是任何整數(shù)的因數(shù),先把因數(shù)1確定下來(lái),即因數(shù)和S賦初值1,然后設(shè)置K從2到A/2的循環(huán),由表達(dá)式A/K判別K是否是A的因數(shù),并求出A的因數(shù)累加和S。最后若滿(mǎn)足條件A=S說(shuō)明A是完全數(shù),作打印輸出。把n的因數(shù)從1開(kāi)始,由小到大排列,寫(xiě)成和式。
程序代碼如下:
#include
void main()
{
int a,s,k;
int n=0;
printf("(2,10000)中的完全數(shù): ");
for(a=2;a<=10000;a++)
{
s=1;
for(k=2;k<=a/2;k++)
if((float)a/k==a/k) s=s+k;
if(s!=a)goto A;
n=n+1;
printf("%d:%d=1",n,a);
for(k=2;k<=a/2;k++)
if((float)a/k==a/k)printf("+ %d",k);
printf("\n");
A:;
}
}