力扣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 }