废不多说先放链接。
力扣507完美数https://leetcode-cn.com/problems/perfect-number/题目还是很简单的,思路也很明确,没有特别要说明的点,这一题似乎是学习过程比较经典的题目了,大体上考了循环的知识点还有一些基础语法知识。
代码:
package cn.daycode.leetcode;
public class CheckPerfectNumber {
public static void main(String[] args) {
Solution s = new Solution();
// 测试用例
int ass[] = {28,6,496,8128,2,1,0};
for(int a : ass) {
System.out.println(s.checkPerfectNumber(a));
}
}
static class Solution {
public boolean checkPerfectNumber(int num) {
int sum = 1;
// 从2开始,直到num的开方为止,依次尝试
for(int i = 2; i <= Math.sqrt(num); i++){
// 对i取余为0则是其因数
if(num % i == 0){
int ni = num/i;
// 因数是本身则可以结束了
if(ni == i){
sum += i;
break;
// 否则将两个因数都加到sum上
}else{
sum = sum + i + ni;
}
}
}
// 最终判断一下sum是否跟num相等即可
// 要特别注意一下上面的逻辑无法剔除1,1不是完数,这里单独拎出来判断
return num > 1 && sum == num;
}
}
}