酷代码 AI
菜单

一个正整数若等于除自己本身外 的因子和,则称此数为完全数。 例如:6有因子1,2,3。同时6=1+2+3,所以6是完全数。 打印1~n的所有完全数。 输入 一个正整数 N ( 0 ≤ 𝑁 ≤ 10 18 ) 输出 打印1~n的所有完全数。 样例输入 复制 1000 样例输出 复制 6 28 496

```python def find_perfect_numbers(n): # 已知的完全数都是梅森素数对应的形式:2^(p-1) * (2^p - 1) # 其中 p 是素数,且 2^p - 1 也是素数(梅森素数) # 对于 n ≤ 10^18,只需要检查前几个梅森素数 # 前几个梅森素数对应的完全数 perfect_numbers = [] # 已知的梅森素数指数 p mersenne_primes = [2, 3, 5, 7, 13, 17, 19, 31] for p in mersenne_primes: # 计算梅森数 M = 2^p - 1 mersenne = (1 << p) - 1 # 2^p - 1 # 计算对应的完全数 perfect = (1 << (p - 1)) * mersenne # 2^(p-1) * (2^p - 1) # 如果完全数在范围内,添加到结果列表 if perfect <= n: perfect_numbers.append(perfect) else: # 由于完全数按指数增长,后续的完全数都会超过 n break return perfect_numbers # 读取输入 n = int(input()) # 查找完全数 result = find_perfect_numbers(n) # 输出结果 for num in result: print(num) ``` 代码说明: 1. 完全数的数学性质:完全数具有特定形式,即 `2^(p-1) * (2^p - 1)`,其中 `p` 是素数,且 `2^p - 1` 也是素数(梅森素数)。 2. 算法优化:直接检查每个数的因子和会超时,特别是当 `n` 最大可达 `10^18` 时。利用完全数的数学性质,只需检查已知的梅森素数对应的完全数。 3. 已知梅森素数:代码中列出了前几个梅森素数指数 `p`,对应的完全数在 `10^18` 范围内只有前几个。 4. 位运算优化:使用 `1 << p` 计算 `2^p`,效率高于 `2p`。 5. 提前终止:当计算出的完全数超过 `n` 时,后续的完全数必然更大,可以提前结束循环。 时间复杂度:O(1),因为只检查固定数量的梅森素数。 空间复杂度:O(1),只使用常数空间存储结果。 [2026-01-18 12:42:34 | AI问答 | 575点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多