做练习题的时候没查到python版的教程,于是自己写了一个
先看没过的代码:
def fdy(n):
lis = []
for i in range(1,n):
if n % i == 0: #判断是否能整除(是否为因数)
lis.append(i)
t = lis
return t
print(fdy(int(input())))
这个是基础版,相信大家都看的懂
优化后的:
def cf(n):
li = [] #创建空列表用于存储因数
for i in range(1, int(n**0.5) + 1): #因数从一开始算,算到原本的数的平方根停止
if n % i == 0: #检测是i是否能被n整除(是否为因数)
li.append(i) #将因数 i 加入列列表
li.append(int(n/i)) #加入 i 所对应的另一个因数
li = list(set(li)) #去个重(i恰好为平方根时会重复)
li.sort() #排序(可以不用)
return li #返回处理好的列表
print(cf(int(input()))) #调用
首先先看这个图——16的因数【1,2,4,8,16】
1 | 16 |
2 | 8 |
4 | 4 |
5 | 2 |
16 | 1 |
可以看出16的因数是成对存在的,而且到平方根的时候就会开始重复
其他数字也遵循这个规律,它们的因数对开始重复的数字也都小于等于他们的平方根,大家可以试试试看
因此,只需要算到即可,对应的数字可以用 n / i 计算得出。
for i in range(1, int(n**0.5) + 1): #因数从一开始算,算到原本的数的平方根停止
if n % i == 0: #检测是i是否能被n整除(是否为因数)
li.append(i) #将因数 i 加入列列表
li.append(int(n/i)) #加入 i 所对应的另一个因数
它的效率在数字大的时候就能很好的体现出来,例如基础版要检测一万次的时候,优化版只要检测一百次就能达到同样的效果。这个数字越大效果越明显
有不懂的地方可以在评论区留言,我看到的话会回复的。(第一次写,可能写的不是很清楚)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)