c語言求完全數

完全數:如果一個數恰好等於它的因子之和,則稱該數爲"完全數"


兩種方法自行比較吧,我直接貼代碼

#include<iostream>
#include<time.h>

#define max 100000//計算出max以內的所有完全數

using namespace std;

//方案一,根據定義
//如果一個數恰好等於它的因子之和,則稱該數爲"完全數"
void main() {
	clock_t start, end;

	start = clock();

	for (int i = 3; i <= max; ++i) {

		int sum = 1;//因子之和

		for (int j = 2; j < i; ++j) {

			if (i%j == 0) {//說明j是i的因子

				sum += j;//求和
			}
		}
		
		if(sum==i){//判斷和是否等於數本身
		
			cout << i << endl;
		}
	}
	
	end = clock();

	float time = (float)(end - start) / 1000;

	cout << "time is" << time << "s" << endl;

	system("pause");

}
//10000				0.173s
//100000			17.507s

#include<iostream>
#include<time.h>
#include<math.h>

#define max 1000000000

using namespace std;

//方案二,通過梅森素數
//原理:如果(2^p-1)是素數,那麼它就是梅森素數,再根據用(2^p-1)*2^(p-1),這個就是完全數。

bool Prime(int prime);

void main() {
	clock_t start, end;

	start = clock();

	for (int p = 2;; ++p) {

		int perfect = (pow(2,p) - 1) * pow(2 ,p - 1);

		if (perfect > max)break;

		int prime = pow(2, p) - 1;

		if (Prime(prime))cout << perfect << endl;
	}


	end = clock();

	float time = (float)(end - start) / 1000;

	cout << "time is" << time << "s" << endl;

	system("pause");

}

bool Prime(int prime) {

	bool choice = true;//假設爲質數

	int k = sqrt((float)prime);

	for (int j = 2; j <= k; ++j) {

		if (prime % j == 0) {//不是質數

			choice = false;

			break;
		}
	}

	return choice;
}
//方案				10^4				10^5			10^8			10^10
//1					0.173s				17.507s		
//2					0s					0.001s			0.001s			超出範圍
//個數				3					4				5

//完全數
//6
//28 
//496 
//8128 
//33550336 

老實說,我這篇博客並沒有實現我最初想要的結果,這種求法網上一搜一大堆,我只能求到第五個完全數,但是速度卻非常的快,之所以不能繼續求下去不是受速度的限制,而是受到數據結構的限制,C語言中int型也就到此爲止了,我若想算更大的完全數就要實現高精度運算。爲此我之前寫過高精度運算的文章,但是把這兩個東西結合起來卻不是很容易。總之,思路就是這樣,以後有機會我再去弄吧(但是python裏應該不用考慮數據類型)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章