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