原文题目:
解题:
寻找一个完美数,定义是除了自身之外的其他因子(包括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; } };