python经典百题之寻找完数

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程

找出1000以内的所有完数。

方法一:

思路:利用两个循环分别枚举每个数和它的因子,如果发现一个数的因子之和等于这个数本身,就输出这个数。

优点:实现简单,易于理解。

缺点:时间复杂度较高,算法效率不高。

代码如下:

python 复制代码
for i in range(1, 1001):
    s = 0
    for j in range(1, i):
        if i % j == 0:
            s += j
    if s == i:
        print(i)

方法二:

思路:优化枚举因子的范围,对于每个数n,只需枚举1~sqrt(n)的数,如果发现n能被i整除,那么n/i也一定是n的因子之一。

优点:枚举因子的范围更小,算法效率较高。

缺点:代码实现稍微复杂一些。

代码如下:

python 复制代码
import math

for i in range(1, 1001):
    s = 1
    for j in range(2, int(math.sqrt(i))+1):
        if i % j == 0:
            s += j + (i // j)
    if s == i:
        print(i)

方法三:

思路:利用列表推导式计算每个数的因子,然后判断因子之和是否等于这个数本身。

优点:代码简洁,易于理解。

缺点:时间复杂度较高,算法效率不高。

代码如下:

python 复制代码
res = [i for i in range(1, 1001) if sum(j for j in range(1, i) if i % j == 0) == i]
print(res)

方法四:

思路:利用一个字典存储每个数的因子之和,然后再遍历字典找到完数。

优点:时间复杂度较低,算法效率高。

缺点:空间复杂度较高,需要额外的空间存储字典。

代码如下:

python 复制代码
d = {}
for i in range(1, 1001):
    d[i] = sum(j for j in range(1, i) if i % j == 0)

for k, v in d.items():
    if k == v:
        print(k)
相关推荐
DuHz几秒前
自动驾驶雷达干扰缓解:探索主动策略论文精读
论文阅读·人工智能·算法·机器学习·自动驾驶·汽车·信号处理
Ulyanov1 分钟前
Python射击游戏开发实战:从系统架构到高级编程技巧
开发语言·前端·python·系统架构·tkinter·gui开发
漫随流水3 分钟前
leetcode算法(257.二叉树的所有路径)
数据结构·算法·leetcode·二叉树
liu****5 分钟前
神经网络基础
人工智能·深度学习·神经网络·算法·数据挖掘·回归
有一个好名字6 分钟前
力扣-二叉树的最大深度
算法·leetcode·深度优先
Aaron15886 分钟前
基于RFSOC 49DR+VU13P的64通道VPX架构波束成形技术分析
c语言·人工智能·算法·架构·信息与通信·信号处理·基带工程
我是一只小青蛙8888 分钟前
二分查找巧解数组范围问题
java·开发语言·算法
C_心欲无痕9 分钟前
构建工具中的 hash 与 contenthash作用:以 Webpack 和 Vite 为例
算法·webpack·哈希算法
Jayden_Ruan9 分钟前
C++水仙花数
开发语言·c++·算法
MicroTech202510 分钟前
量子神经网络(QNN):微算法科技(NASDAQ :MLGO)图像分类技术新范式
科技·神经网络·算法