您的位置:首页 > 编程语言 > C语言/C++

C语言之基本算法38—格式化输出10000以内的所有完数

2015-07-14 02:41 253 查看
//穷举法!

/*

==================================================================

题目:求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次)。

========================================================================

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: