Python 实现:计算 n! 不同因子个数,附代码详解与复杂度分析
以下是使用Python实现计算 `n!` 不同因子个数的代码: ```python # 该函数用于对一个数进行质因数分解并统计每个质因数的指数 def prime_factorize(num, prime_count): # 从2开始遍历到该数的平方根 divisor = 2 while divisor * divisor <= num: while num % divisor == 0: # 如果该质因数已经在字典中,将其指数加1 if divisor in prime_count: prime_count[divisor] += 1 else: # 若不在字典中,将其添加到字典并将指数设为1 prime_count[divisor] = 1 num //= divisor divisor += 1 # 如果最后剩余的数大于1,说明它本身是一个质因数 if num > 1: if num in prime_count: prime_count[num] += 1 else: prime_count[num] = 1 # 该函数用于计算 n! 的不同因子个数 def count_factors(n): prime_count = {} # 对从2到n的每个数进行质因数分解 for i in range(2, n + 1): prime_factorize(i, prime_count) factor_count = 1 # 根据质因数指数计算因子个数 for exponent in prime_count.values(): factor_count *= (exponent + 1) return factor_count # 读取输入的整数n n = int(input()) # 计算并输出 n! 的不同因子个数 print(count_factors(n)) ``` 代码说明: 1. `prime_factorize` 函数:该函数用于对一个数进行质因数分解,并统计每个质因数的指数。它会遍历从2到该数平方根的所有数,将能整除该数的质因数及其指数记录在字典 `prime_count` 中。 2. `count_factors` 函数:该函数会对从2到 `n` 的每个数调用 `prime_factorize` 函数进行质因数分解,统计所有质因数的指数。然后根据公式:如果一个数可以表示为 $p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$(其中 $p_i$ 是质因数,$a_i$ 是其指数),那么它的因子个数为 $(a_1 + 1)(a_2 + 1)\cdots(a_k + 1)$,计算并返回 `n!` 的不同因子个数。 3. 主程序:读取输入的整数 `n`,调用 `count_factors` 函数计算并输出 `n!` 的不同因子个数。 复杂度分析: - 时间复杂度:$O(n\sqrt{n})$,其中 $n$ 是输入的整数。因为对每个从2到 $n$ 的数都要进行质因数分解,而质因数分解的时间复杂度是 $O(\sqrt{n})$。 - 空间复杂度:$O(k)$,其中 $k$ 是 `n!` 的不同质因数的个数。主要用于存储质因数及其指数的字典。 ######[AI问答 | 731点数解答 | 2026-01-12 12:15:34]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)458
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)226
- C++求解序列或与运算和差值:避O(nq)复杂度及数据处理要点(字节豆包 | 534点数解答 | 2025-10-17 20:05:07)60
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)414
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)405
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)49
- 深入探究:n 位格雷码中编号 k 二进制串的求解算法与实现(DeepSeek | 726点数解答 | 2026-01-13 12:31:37)50
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- C++ 实现游戏赢家判断:巧妙找出满足和条件的最大数 (DeepSeek | 506点数解答 | 2025-06-20 16:18:09)113
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)457
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)354