完全數:如果一個數恰好等於它的因子之和,則稱該數爲"完全數"
兩種方法自行比較吧,我直接貼代碼
#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裏應該不用考慮數據類型)