编写程序:
输出1000以内的所有完数及其因子。所谓完数是指一个整数的值等于它的因子之和,例如6的因子是1,2,3,而6=1+2+3,故6是一个完数。
/*
求出1000以内的所有完数以及它的因子
*/
# include <stdio.h>
int main( void )
{
int i, j, sum;
/*
第一个循环,检查从1到1000中的每一个数字是不是完数
如果是完数,输出完数和它所有的因子
*/
for( i = 1; i <= 1000; ++i )
{
/*
检查该数字是否是完数
方法:从1到i-1,依次取余,余数为0,说明是它的公约数,
累加公约数,最后的值如果等于i,这说明i就是完数。
*/
sum = 0;
for( j = 1; j < i; ++j )
{
if( i%j == 0 )
{
sum += j;
}
}
if( sum == i )
{
printf( "完数是:%d,它的因子是:", i );
/*
这个for循环是将其所有因子取出
和第22行的for循环思路是一样的
*/
for( j = 1; j < i; ++j )
{
if( i%j == 0 )
{
printf( "%d ", j );
}
}
printf( "\n" );
}
}
return 0;
}
/*
VC++6.0输出的结果是
=================================================
完数是:6,它的因子是:1 2 3
完数是:28,它的因子是:1 2 4 7 14
完数是:496,它的因子是:1 2 4 8 16 31 62 124 248
=================================================
总结:
完数很轻松的就输出出来了,怎么把因子给分别输出出来让我想来半天。
其实很简单,脑子一下子没转过来弯
第10行的for循环,就是把它的因子相加,得到的sum,一旦sum成立,
说明拿到的所有j都是因子,在第20行输出完数之后,再把第10行for循环
拿到的所有j,输出就完事了。
(虽然感觉时间复杂度好高~~~~(>_<)~~~~)
*/
时间复杂度确实好高,不知道还有没有更好的办法来实现这个程序。
学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog