用 Python 打印 100000 以内的所有完全数

用 Python 打印 100000 以内的所有完全数
最新回答
天边シ深海

2026-10-23 15:35:22

在100000以内,完全数共有4个,分别是6、28、496和8128。以下是使用Python打印这些完全数的代码实现及优化过程:

基础实现1. 理解完全数

完全数是指等于其所有真因子(即除了自身以外的正因子)之和的正整数。例如:

  • 6的因子为1、2、3,且1 + 2 + 3 = 6。
2. 基础代码

通过遍历1到100000的每个数,计算其真因子之和并判断是否为完全数:

def is_perfect_number(n): if n < 2: return False sum_divisors = 1 # 1是所有大于1的数的因子 for i in range(2, n): if n % i == 0: sum_divisors += i return sum_divisors == ndef main(): for num in range(1, 100000): if is_perfect_number(num): print(f"{num} 是一个完全数")if __name__ == "__main__": main()优化实现1. 减少循环次数

通过遍历到√n并成对收集因子,显著减少计算量:

import mathdef is_perfect_number(n): if n < 2: return False sum_divisors = 1 for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: sum_divisors += i if i != n // i: # 避免重复添加平方数因子 sum_divisors += n // i return sum_divisors == n2. 多进程并行计算

利用multiprocessing库将计算任务分配到多个进程,提升大范围搜索的效率:

from multiprocessing import Pooldef check_range(start, end): for num in range(start, end): if is_perfect_number(num): print(f"{num} 是一个完全数")def main(): upper_limit = 100000 num_processes = 4 pool = Pool(num_processes) # 分割任务范围 ranges = [(i, min(i + upper_limit // num_processes, upper_limit)) for i in range(1, upper_limit, upper_limit // num_processes)] pool.starmap(check_range, ranges) pool.close() pool.join()代码解释
  1. is_perfect_number函数:

    输入:整数n。

    逻辑:

    初始化因子和为1(因为1是所有数的因子)。

    遍历2到√n,成对收集因子(如i和n//i)。

    检查因子和是否等于n。

    优化点:仅遍历到√n,避免重复计算。

  2. 多进程部分:

    将100000的范围分割为多个子范围(如4进程时每个进程处理25000个数)。

    每个进程独立检查其分配范围内的完全数,最后合并结果。

执行结果

运行优化后的代码,输出100000以内的完全数:

6 是一个完全数28 是一个完全数496 是一个完全数8128 是一个完全数总结
  • 完全数特性:在100000以内仅存在6、28、496和8128四个完全数。
  • 优化效果:

    基础方法需遍历约10万次,而优化后每次仅需遍历到√n(最多约316次)。

    多进程进一步将时间缩短至单进程的1/4(具体取决于CPU核心数)。

  • 扩展性:代码可轻松调整范围上限或进程数量,适用于更大范围的搜索。

通过逐步优化,代码在保持简洁的同时显著提升了效率,适合处理更大规模的完全数搜索任务。