Perfect Number[完数]

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。

#include<iostream>
#include<time.h>
#include<math.h>
#define max 1e9
using namespace std;
//梅森素数
//原理:如果(2^p-1)是素数,那么它就是梅森素数,再根据用(2^p-1) * 2^(p-1),这个就是完全数。
bool Prime(int prime);
int 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;
	return 0; 
}
 
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;
}

/*完全数

6

28

496

8128

33550336

------------------------------------------------------------------------------------------------------------------------------------

6

28

496

8128

33550336

time is0.006s

//判断素数
/*
1.如果数不是很大,且追求速度快,接近O(n)可用埃式筛法sieve,
但需要开辟数组空间is_prime[maxx]来记录是否为素数。
然后直接判断is_prime[index]
2.普通判断方法:
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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值