题目大意
对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。
给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False。
示例:
输入: 28
输出: True
解释: 28 = 1 + 2 + 4 + 7 + 14
提示:
输入的数字 n 不会超过 100,000,000. (1e8)
在真实的面试中遇到过这道题?
方法一
暴力法,最大只需遍历到num开平方。
public boolean checkPerfectNumber(int num) {
if(num<=1) return false;
int res = 0;
for(int i=1;i<=Math.sqrt(num);i++)
if(num%i==0)
res += (i+num/i);
return res-num == num?true:false;
}
运行时间4ms,击败35.84%。
方法二
欧几里得方法,每个偶数完美数都可以写作2(p-1)*(2p-1)。奇数的完美数暂未发现。
private 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;
}
运行时间1ms,击败99.35%。