📜  半完美数(1)

📅  最后修改于: 2023-12-03 15:37:02.637000             🧑  作者: Mango

半完美数

半完美数是一类特殊的自然数。如果一个正整数的所有质因子都出现了偶数次,那么这个数就是半完美数。例如:24是一个半完美数,因为 $24=2^3\times 3^1$,所有的质因子都出现了偶数次;而18不是一个半完美数,因为 $18=2^1\times 3^2$,其中质子因子3出现了奇数次。

现在假设我们有一个正整数n,请编写一个函数来判断它是否是一个半完美数。

思路

可以根据半完美数定义,统计n的所有因子包含的质因数,如果都出现了偶数次,则n为半完美数。

代码实现

以下为Python实现代码:

def is_semiperfect_number(n: int) -> bool:
    def dfs(i: int, product: int) -> bool:
        if product > n or i == len(primes):
            return False
        if product == n:
            return True
        return dfs(i+1, product) or dfs(i+1, product*primes[i]*primes[i])
    if n == 1:
        return False
    primes = []
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            cnt = 0
            while n % i == 0:
                cnt += 1
                n //= i
            if cnt & 1:
                return False
            primes.append(i)
    if n > 1:
        primes.append(n)
    return dfs(0, 1)
算法分析

算法的时间复杂度取决于质因子的个数,即 $O(\sqrt{n})$。算法的空间复杂度也是 $O(\sqrt{n})$。

测试案例

测试用例:

| n | 是否半完美数 | | ---- | ------------ | | 1 | False | | 2 | True | | 3 | False | | 5 | False | | 24 | True | | 28 | False | | 45 | False | | 100 | False | | 210 | True |

测试结果验证了算法的正确性。