力扣507(java)-完美数(简单)

题目:

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/perfect-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

根据完美数的定义,需要排除自身,那么1一定不是一个完美数,且完美数的正因子一定是成对出现的,故可以只枚举出每对中较小的一个即枚举范围为[1,sqrt(num)]。

例如:num=36

36除自身以外的正因子为1,2,3,4,6,9,12,18,除1和6以外都是成对出现的[2,18],[3,12],[4,9],故只需要遍历到6就可以,且6只能计算一次。

或者让遍历的起始数 i 从2开始(1不是完美数),上限条件为 i <= num / i

代码:

 1 class Solution {
 2     public boolean checkPerfectNumber(int num) {
 3         if(num == 1) return false;
 4         //定义和的初始值为1
 5         int sum  = 1;
 6         for(int i = 2; i <= num / i; i++){
 7             if(num % i == 0){
 8                 //能被整除,加上小的因子
 9                 sum += i;
10                 //当前数不能被完全平方则加上大的因子
11                 //否则能被完全平方只能加一个
12                 if( i*i != num){
13                     sum += num / i;
14                 }
15             }
16         }
17         return sum == num;
18     }
19 }

posted on 2022-08-28 16:59  我不想一直当菜鸟  阅读(43)  评论(0编辑  收藏  举报