小蚂蚁学习C语言(37)——题目——求出1000之内的全部完数以及它的因子

编写程序:spa

    输出1000之内的全部完数及其因子。所谓完数是指一个整数的值等于它的因子之和,例如6的因子是1,2,3,而6=1+2+3,故6是一个完数。
.net

/*
	求出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,输出就完事了。
		(虽然感受时间复杂度好高~~~~(>_<)~~~~)
		
*/

    时间复杂度确实好高,不知道还有没有更好的办法来实现这个程序。
code

    

    学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blogblog

相关文章
相关标签/搜索