它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。
#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;
}
*/