【題目】507. 完美數
對於一個 正整數,如果它和除了它自身以外的所有正因子之和相等,我們稱它爲“完美數”。
給定一個 整數 n, 如果他是完美數,返回 True,否則返回 False
示例:
輸入: 28
輸出: True
解釋: 28 = 1 + 2 + 4 + 7 + 14
提示:
輸入的數字 n 不會超過 100,000,000. (1e8)
【解題思路1】暴力列舉因數
class Solution {
public boolean checkPerfectNumber(int num) {
if(num == 1){
return false;
}
int sum = 1;
int max = (int)Math.sqrt(num);
for(int i=2; i<=max; i++){
if(num % i == 0){
sum = sum + i + num/i;
}
}
if(sum == num){
return true;
}
return false;
}
}
【解題思路2】數學
歐幾里得-歐拉定理告訴我們,每個偶完全數都可以寫成以下形式,其中 p 爲素數。
例如前四個完全數可以寫成如下形式:
6 = 2^1 * (2^2 - 1)
28 = 2^2 * (2^3 - 1)
496 = 2^3 * (2^4 - 1)
8128 = 2^4 * (2^5 - 1)
由於目前奇完全數還未被發現,因此所有的完全數都可以寫成上述形式。當 n 不超過 10^8 時,p 也不會很大,因此我們只要帶入最小的若干個素數 2, 3, 5, 7, 13, 17, 19, 31,將不超過 10^8 的所有完全數計算出來即可。
public class Solution {
public int pn(int p) {
return (1 << (p - 1)) * ((1 << p) - 1);
}
public boolean checkPerfectNumber(int num) {
int[] primes=new int[]{2,3,5,7,13,17,19,31};
for (int prime: primes) {
if (pn(prime) == num)
return true;
}
return false;
}
}