def 约数(n):
if n<=3:return [1,n]
m=int(n**0.5) #这里之前有个取整除的运算,后来发现int默认就是截断操作
y=[]
for i in range(1,m+1):
if n%i==0:
y.append(i)
y.append(int(n/i))
return set(y)
约数(100000)
35.1 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
以上代码可以再优化一点点,例如开方后正好又是个整数呢
截取自我的啃书随笔,python - 啃书 第五章 函数
以下是失败历程,大佬还有更好的方法,很数学的那种,但我看不懂!
高效率求约数的个数
这里我想到一个问题,如何优化求约数的步骤,例如,如果一个数无法成为2的倍数,自然也就无法成为偶数的倍数,同理,无法成为3的倍数,就无法成为3的倍数的倍数,于是,待求约数的集合就是1~该数,每一个质数无法称为约数的话,其倍数也无法成为约数,此时就使用集合的处理方法,将他的倍数从待求约数中去除,那先写一个代码来获取随一些数的约数,看下结果,验证下想法。
import random
while 1:
inputs=input("回车:随机数;数字回车:输入数;eixt回车:退出")
if inputs=="exit":break
elif inputs.isalnum():r=int(inputs)
else:r=random.randint(1,100)
约数=[]
质数=[]
print(str(r)+"的开方是:"+str(r**0.5))
for i in range(1,r+1):
if r%i==0:约数.append(i)
print(str(r)+"的所有约数:"+str(约数))
for i in range(2,r+1):
c=0
for j in range