1. 程式人生 > >完美數的演算法設計(C語言)

完美數的演算法設計(C語言)

完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。它所有的真因子(即除了自身以外的約數)的和(即因子函式),恰好等於它本身。如果一個數恰好等於它的因子之和,則稱該數為“完全數”。
尋找完美的數
題目描述:所謂完美的數是這個數除了它自身之外,所有因子的和等於該數。
例如: 28,其因子包括:1,2,4,7,14,28,除了28之外,1+2+4+7+14 = 28
再例如:6,其因子包括:1,2,3,6 除了6之外,1+2+3 = 6
尋找 1~10000之間的完美的數。

法一程式程式碼如下:

#include<stdio.h>
int fun_perfect(int number)
{
	int i,sum=0;
	for(i=1;i<number;i++)
	{
		if(number%i==0){
			sum+=i;
		}
		if(sum>number)
		return 0;
	}
	return sum==number;
}
int main()
{
	int i; 
	for(i=2;i<10000;i++)
	{
		if(fun_perfect(i))
		printf("%d\n",i);
	}
	return 0;
}

很明顯,此法較為暴力,當搜尋範圍較小時,執行的效率可以被接受,但倘若所搜尋的範圍高達十幾萬,此法執行效率較低需十幾秒。

法二:優化暴力搜尋程式程式碼如下:

#include<stdio.h>
#include<math.h>
int fun_perfect(int number)
{
	int i,sum=1;
	for(i=2;i*i<number;i++)
	{
		if(number%i==0)
		{
			sum+=i;
			if(i*i!=number)
			{
				sum+=number/i;
			}
		}
	}
	return sum==number;
}
int main()
{
	int i; 
	for(i=2;i<100000;i++)
	{
		if(fun_perfect(i))
		printf("%d\n",i);
	}
	return 0;
}

法三:利用推導公式:
大數學家尤拉曾推算出完全數的獲得公式:如果p是質數,且2p-1也是質數,那麼(2p-1)X2^(p-1)便是一個完全數。
例如p=2,是一個質數,2p-1=3也是質數,(2p-1)X2^(p-1)=3X2=6,是完全數。
例如p=3,是一個質數,2p-1=7也是質數,(2p-1)X2^(p-1)=7X4=28,是完全數。
例如p=5,是一個質數,2p-1=31也是質數,(2p-1)X2^(p-1)=31X16=496是完全數。
但是2p-1什麼條件下才是質數呢?事實上,當2p-1是質數的時候,稱其為梅森素數。到2013年2月6日為止,人類只發現了48個梅森素數,較小的有3、7、31、127等。


程式程式碼如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int arr[5]={2,3,5,7,11};
	for(int i=0;i<5;i++)
	{
		int num=pow(2,arr[i]-1)*(pow(2,arr[i])-1);
		if(num<100000){
			printf("%d\n",num);
		}
	}
	return 0;
}