leetcode 507. 完美數

【題目】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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章