我必须编写代码来计算在任意2个给定数字(A [0],A [1])(包括两者)之间具有最大除数的元素数量。我必须采用以空格分隔的线的形式输入。输入的第一行给出了示例中存在的案例数。这段代码可以正常工作,但是需要一些时间来执行。谁能帮我更有效地编写此代码?
import numpy as np
from sys import stdin
t=input()
for i in range(int(t)):
if int(t)<=100 and int(t)>=1:
divisor=[]
A=list(map(int,stdin.readline().split(' ')))
def divisors(n):
count=0
for k in range(1,int(n/2)+1):
if n%k==0:
count+=1
return count
for j in np.arange(A[0],A[1]+1):
divisor.append(divisors(j))
print(divisor.count(max(divisor)))
样本输入:
2
2 9
1 10
样本输出:
3
4
答案 0 :(得分:0)
有一种方法可以根据数字的质因数来计算除数。 考虑到素数分解,计算除数的速度比尝试除法的速度快(您可以在此处进行此操作)。
但是素数分解必须快速。对于具有预先计算的质数列表(易于执行)的小数,可以快速进行质因数分解,并且也可以快速进行除数计算。如果您知道要测试的数字的上限(我们称其为L
),则需要不超过sqrt(L)
的质数。给定数字n = p_1^e_1 * p_2^e_2 * .. * p_k^e_k
和number of divisors is simply (1+e_1) * (1+e_2) * .. * (1+e_k)
甚至更多,您可以预先计算和/或记住一些过度使用的数字的除数的数量,直到一定数量。这样可以节省大量时间,但会增加内存,否则您可以直接进行计算(例如,使用以前的方法)。
除此之外,您可以对代码进行一些优化。例如,您可以避免一直进行int(t)
强制转换(和类似操作),只执行一次并将其存储在变量中。
Numpy
可以一起避免,它是多余的,我怀疑会增加速度优势,取决于。
这应该使您的代码更快,但始终需要通过实际测试来衡量性能。