📜  最多为 N 且只有 4 个因子或除数的数字计数(1)

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

最多为 N 且只有 4 个因子或除数的数字计数

本文介绍如何计算最多为 N 且只有 4 个因子或除数的数字总数。

思路

一个数 N 的因子或除数最多只有两个因子或除数相等,在这种情况下,N 可以表示为 $a^2$ 的形式。为了使一个数的因子或除数总数为 4,可以将其表示为两个不同的质数的积,即 $p_1 * p_2$,或者表示为一个质数的立方,即 $p^3$。

因此,只需要枚举素数 p 和另一个素数 q,或者枚举素数 p 的立方根即可。

代码实现
def count_numbers_with_4_divisors(N):
    """
    计算最多为 N 且只有 4 个因子或除数的数字总数
    """
    primes = get_primes(int(N ** 0.5) + 1)
    result = 0
    for i in range(len(primes)):
        if primes[i] ** 3 > N:
            break
        for j in range(i + 1, len(primes)):
            if primes[i] * primes[j] > N:
                break
            result += 1
    return result

def get_primes(n):
    """
    获取小于等于 n 的所有素数
    """
    is_prime = [True] * (n + 1)
    is_prime[0] = is_prime[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if is_prime[i]:
            for j in range(i * i, n + 1, i):
                is_prime[j] = False
    return [i for i in range(n + 1) if is_prime[i]]
使用示例
>>> count_numbers_with_4_divisors(10)
0
>>> count_numbers_with_4_divisors(12)
1
>>> count_numbers_with_4_divisors(25)
2
>>> count_numbers_with_4_divisors(40)
3
>>> count_numbers_with_4_divisors(100)
9

解释:

  • 对于 10,没有最多只有 4 个因子或除数的数字。
  • 对于 12,可以表示为 $2^2 * 3$,因此只有一个数字满足条件。
  • 对于 25,可以表示为 $5^2$ 和 $2 * 5$,因此有两个数字满足条件。
  • 对于 40,可以表示为 $2^3 * 5$,$2^2 * 5$ 和 $2 * 5^2$,因此有三个数字满足条件。
  • 对于 100,可以表示为 $2^2 * 5^2$,$2^2 * 5$,$2 * 5^2$,$2 * 3^2$,$2 * 7^2$,$3 * 5^2$,$5 * 7$,$2 * 11^2$ 和 $3 * 13$ 共 9 个数字满足条件。