对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。
示例 1:
输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。
示例 2:
输入:num = 7
输出:false
提示:
1 <= num <= 108
通过次数61,582提交次数126,165
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package cn.fansunion.leecode.isNumber;
/**
* 507. 完美数 对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
*
* 给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。
*
* 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*
* @author [email protected]
*
* 2022-2-19
*/
public class PerfectNumber {
/*示例 1:
输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。
示例 2:
输入:num = 7
输出:true
提示:
1 <= num <= 108*/
/**
* 从1到num-1,找出所有因子求和,同num比较。
* @param num
* @return
*/
public boolean checkPerfectNumber(int num) {
//优化点2点:num=1,特殊判断;遍历的最大值
int sum = 0;
for (int i = 1; i < num; i++) {
if (num % i == 0) {
sum += i;
}
}
return sum == num;
}
/**
* 有问题:本来想的是sum初始化为1,因为1是每个数的因子。但是,特殊num输入“1”,就没判断到排除自己。
* 这个代码,排除自己本身作为因子,是通过i<num来判定的。
* 因此:为了优化,结果反而坑了
* 从1到num-1,找出所有因子求和,同num比较。
* @param num
* @return
*/
public boolean checkPerfectNumberError(int num) {
int sum = 1;
for (int i = 2; i < num; i++) {
if (num % i == 0) {
sum += i;
}
}
return sum == num;
}
}
package test.leecode.isNumber;标签:完美,sum,28,3624,int,因子,num,checkPerfectNumber From: https://blog.51cto.com/fansunion/6056785
import org.junit.Assert;
import org.junit.Test;
import cn.fansunion.leecode.isNumber.PerfectNumber;
/**
* @author [email protected]
*
* 2022-2-19
*/
public class PerfectNumberTest {
@Test
public void test() {
PerfectNumber pn = new PerfectNumber();
Assert.assertTrue(pn.checkPerfectNumber(28));
Assert.assertFalse(pn.checkPerfectNumber(2));
Assert.assertFalse(pn.checkPerfectNumber(3));
Assert.assertFalse(pn.checkPerfectNumber(8));
}
}