首先我们最开始想到的是遍历,但这是16位数,而且至少两层for,一定会超时,就算是填空题,在自己电脑上运行也会跑很长~~~时间(亲测),在等了30秒左右,我果断终止了程序开始寻找其他方法。
思路:不需要从1到最后一位都遍历一遍,只需遍历n的乘积因子,例3*4==12,找到它所有的因子再遍历会节省很多时间。在这其中还有也可以优化的地方,既然能找到3,那就顺带能把4一块找到:12/3。 遍历时也可用2层,减少循环层数。
import math
n=2021041820210418
cnt=0
a=[]
for i in range(1,int(math.sqrt(n))+1):
if n%i==0:
a.append(i)
if i*i != n:
a.append(n/i)
print(len(a))
for i in a:
for j in a:
if n%(i*j)==0:
cnt+=1
print(cnt)
i * i != n 的判断:
这是为了避免重复添加因子,因为如果n有一个因子i,那么必然有另一个因子n/i。当i等于n/i时,如果不加判断,程序会将n/i重复添加到a列表中。因此,加上判断语句i*i != n可以避免重复添加因子。