507. Perfect Number
原文题目:
解题:
寻找一个完美数,定义是除了自身之外的其他因子(包括1)总和等于本身的正整数,如28 = 1 + 2 +4 + 7+ 14就是完美数,
思路:
从1开始循环到num/2找到取模为0的数相加,判断总和是否等于自身,思路很简单,但是超时了。
class Solution {
public:
bool checkPerfectNumber(int num)
{
int sum = 0;
int i = 0;
if(num < 2)
{
return false;
}
for(i = 1;i < num/2 +1;i++)
{
if(num%i ==0)
{
sum += i;
}
}
return sum == num;
}
};
继续想想,当整数很大时,循环耗时太久了,思考一下,比如说整数28,循环到4的时候,取模为0,那么4得加上,同样的28/4=7,除数7也是一个因子,也得加上,这样的话一次就加上了两个因子,同时把循环次数从num/2降到sqrt(num)
AC代码:
class Solution {
public:
bool checkPerfectNumber(int num)
{
int sum = 1;
int i = 2;
while(i*i < num)
{
if(num%i==0)
{
sum += i + num/i;
}
i++;
}
return num > 1 && sum == num;
}
};
浙公网安备 33010602011771号