完全数:如果一个数恰好等于它的因子之和,则称该数为"完全数"
两种方法自行比较吧,我直接贴代码
#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里应该不用考虑数据类型)