LeetCode507. 完美数

简单模拟题,直接求num所有因子的和。
这里要注意,num最大可以取到10^8,所以不能是O(n)的时间复杂度(会超时)。
可以借鉴求质数的思想,如果i是num的因子,那么nums / i也是nums的因子,因此我们只需要枚举2~sqrt(num)即可,这样时间复杂度就是O(sqrt(n))。
另外还要注意,枚举的时候,1要单独处理,也是说num为1的情况需要特判,然后枚举因子的时候从2枚举到sqrt(num)即可。

代码如下:

class Solution {
public:
    bool checkPerfectNumber(int num) {
        if(num == 1) {
            return false;
        }
        int sum = 0;                  // sum表示num所有因子的和
        for(int i = 2; i <= num / i; ++i) {      
            if(num % i == 0) {
                sum += i;
                if(i != num / i) {      // 当i不等于sqrt(num)且i是num的因子时,num / i也是num的一个因子
                    sum += num / i;
                }
            }
        }
        if(sum + 1 == num) {            // 这里+1是因为1也是num的一个因子
            return true;
        }
        return false;
    }
};
posted @ 2020-11-11 21:43  machine_gun_lin  阅读(71)  评论(0编辑  收藏  举报