跳转至

507. 完美数

题目描述

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」

给定一个 整数 n, 如果是完美数,返回 true;否则返回 false

 

示例 1:

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

示例 2:

输入:num = 7
输出:false

 

提示:

  • 1 <= num <= 108

解法

方法一:枚举

我们首先判断 \(\textit{num}\) 是否为 1,如果为 1,则 \(\textit{num}\) 不是完美数,返回 \(\text{false}\)

然后,我们从 2 开始枚举 \(\textit{num}\) 的所有正因子,如果 \(\textit{num}\) 能被 \(\textit{num}\) 的某个正因子 \(i\) 整除,那么我们将 \(i\) 加入到答案 \(\textit{s}\) 中。如果 \(\textit{num}\) 除以 \(i\) 得到的商不等于 \(i\),我们也将 \(\textit{num}\) 除以 \(i\) 得到的商加入到答案 \(\textit{s}\) 中。

最后,我们判断 \(\textit{s}\) 是否等于 \(\textit{num}\) 即可。

时间复杂度 \(O(\sqrt{n})\),其中 \(n\)\(\textit{num}\) 的大小。空间复杂度 \(O(1)\)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution:
    def checkPerfectNumber(self, num: int) -> bool:
        if num == 1:
            return False
        s, i = 1, 2
        while i <= num // i:
            if num % i == 0:
                s += i
                if i != num // i:
                    s += num // i
            i += 1
        return s == num
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution {
    public boolean checkPerfectNumber(int num) {
        if (num == 1) {
            return false;
        }
        int s = 1;
        for (int i = 2; i <= num / i; ++i) {
            if (num % i == 0) {
                s += i;
                if (i != num / i) {
                    s += num / i;
                }
            }
        }
        return s == num;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Solution {
public:
    bool checkPerfectNumber(int num) {
        if (num == 1) {
            return false;
        }
        int s = 1;
        for (int i = 2; i <= num / i; ++i) {
            if (num % i == 0) {
                s += i;
                if (i != num / i) {
                    s += num / i;
                }
            }
        }
        return s == num;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func checkPerfectNumber(num int) bool {
    if num == 1 {
        return false
    }
    s := 1
    for i := 2; i <= num/i; i++ {
        if num%i == 0 {
            s += i
            if j := num / i; i != j {
                s += j
            }
        }
    }
    return s == num
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function checkPerfectNumber(num: number): boolean {
    if (num <= 1) {
        return false;
    }
    let s = 1;
    for (let i = 2; i <= num / i; ++i) {
        if (num % i === 0) {
            s += i;
            if (i * i !== num) {
                s += num / i;
            }
        }
    }
    return s === num;
}

评论

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy