​LeetCode刷题实战507:完美数

今天和大家聊的问题叫做 完美数,我们先来看题面:https://leetcode-cn.com/problems/next-greater-element-ii/

A perfect number is a positive integer that is equal to the sum of its positive divisors, excluding the number itself. A divisor of an integer x is an integer that can divide x evenly.


Given an integer n, return true if n is a perfect number, otherwise return false.

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。给定一个 整数 n, 如果是完美数,返回 true,否则返回 false

示例                         

示例 1:
输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。

示例 2:
输入:num = 6
输出:true

示例 3:
输入:num = 496
输出:true

示例 4:

输入:num = 8128
输出:true

示例 5:
输入:num = 2
输出:false

解题


这里要注意,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;
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。


上一篇:​LeetCode刷题实战506:相对名次


下一篇:​LeetCode刷题实战509:斐波那契数