1、LeetCode——507. 完美数
思路:直接从i=1遍历到n,判断n能不能被i整除,能的话说明是因子,于是把所有因子加起来,最后判断是否是和n相等。如果直接以这种思路来写代码的话最后是肯定要超时的,所以要优化。
因子都是成对出现的,假如有个 i 能整除 n ,那么 n/i 也能整除 n ,并且 i 和 n/i 一定满足:i <= n/i,也就是 i 的平方 <= n ,因为是 n 的因子那么就不可能大于 n 。
代码及详情如下:
bool checkPerfectNumber(int num){
if(num <= 1)
return false;
int sum = 0;
for(int i = 1;i * i <= num;i++){
if(num % i == 0){
sum += i; //累加上因子
sum += num / i;
}
}
sum -= num; // 由题不算num本身
return sum == num;
}
2、LeetCode——263. 丑数
思路:直接一直整除2、3、5,到最后如果num=1了,那说明他是个丑数,否则不是。
代码及详情:
bool isUgly(int n){
if(n < 1) return false; //0和负数不是
int arr[] = {2,3,5};
for(int i = 0;i < 3;i++){
while(n % arr[i] == 0){
n /= arr[i];
}
}
return n == 1;
}