C趣味程序(二)(11)完全數(shù)

字號(hào):

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:;
     }
    }