1. 程式人生 > >C語言之基本算法38—格式化輸出10000以內的全部完數

C語言之基本算法38—格式化輸出10000以內的全部完數

() 下一個 nbsp define -a mod 保存 基本算法 -m

//窮舉法!
/*
==================================================================
題目:求10000以內的全部完數,統計數量並以例如以下格式輸出:
28=1+2+4+7+14.
註:完數是除了本身外。其值等於包括1的全部因子之和!
如:28的全部因子是:1,2,4,7,28,除了28外其他因子的和=28,故28是完數!
==================================================================
*/
#include<stdio.h>
#define N 10000
int ws(int a)
{
int i=1;
int sum=0;
while(i<a) //不包括a,由於完數的因子必須小於它本身!
{
if(a%i==0)
sum+=i;
i++;
}
if(sum==a)
return 1;
else return 0;
}
void main()
{
int n=2,i,j,k=0,a[100],shu=0;
printf("%d以內的完數有:",N);
while(n<=N)
{
if(ws(n))
{
for(i=1;i<n;i++)
if(n%i==0)
a[k++]=i;
printf("\n%d: %-4d=%d",shu+1,n,a[0]);
for(j=1;j<k;j++)
printf("+%d ",a[j]);
printf(".\n");
shu++;
k=0;
}
n++;
}
printf("\n一共%d個",shu);
printf("\n");
}
/*
======================================================================
評:
這道題難點在於輸出的格式,完數的推斷是一個簡單問題,甚至能夠用for循環來
實現!

可是要輸出題目要求的格式。就必須先求出其全部因子,保存在預先定義的
數組中,先輸出n=a[0],緊接著通過for循環輸出其余的+因子。在輸出"."。


必須註意要一個一個輸出,就是推斷+輸出+又一次初始化後在算下一個n。直到n>N循
環結束(註意不能用for循環。否則會反復輸出N次)。


========================================================================
*/

C語言之基本算法38—格式化輸出10000以內的全部完數