小螞蟻學習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

相關文章
相關標籤/搜索