C++ 完全數的判斷(證明完全平方數不可能是完全數)


C++ 完全數的判斷

對於自然數\(n\),其除了自身以外的所有因數的和,等於其自身的,稱\(n\)為完全數。在C++中可以通過遍歷\(1\)\(n\)找出所有因數,然后求和驗證。但\(n\)次遍歷往往無法滿足時間復雜度的要求。

注意到,對自然數\(n\),假設其存在因數\(a\),則必存在因數\(b = n / a\),且\(min(a, b)\)不大於\(\sqrt(n)\)。利用這條性質可以將原本需要的n次遍歷減少為\(\sqrt(n)\)次遍歷。


int n, sum = 1;

cin >> n; // n為輸入的自然數n

for (int i = 2; i <= n / i; i ++ ){

if (n % i == 0){

sum += (i + n / i);

}

}

一般的代碼中都沒有考慮\(i = n / i\)的情況,即\(n\)為完全平方數的情況。如何證明完全平方數不可能是完全數?

證明:完全平方數不可能是完全數

對大於3的正整數\(n\),其除了自身的約數的和\(sum(n)\)有:

\[sum(n) < n(n+1)/2 - n = (n^2-n)/2 \]

對於一個完全平方數$ k = n * n \(,如果其為完全數,則\) n \(的約數和\)sum(n) = k - n = n^2 - n$,顯然不可能。所以完全平方數不需要特別處理。

C++ 程序

#include <iostream>
#include <cmath>
using namespace std;

int main(){
int n;
cin >> n;

while(n--){
int x, sum = 1;
cin >> x;
for (int i = 2; i < sqrt(x); i ++){
if (x % i == 0){
sum += i;
sum += x / i;
}
}

if (x != sum || x == 1)
printf("%d is not perfect\n", x);
else
printf("%d is perfect\n", x);
}

return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM