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里应该不用考虑数据类型)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章