如何让这段代码更快?

时间:2017-10-09 13:01:23

标签: python

我已编写此代码来解决Eu​​ler Project No 12,但我的代码运行缓慢。

如何让它更快地运行?我已经阅读了一些关于找到除数的建议,但我不理解sqrt用于n的逻辑。

你能解释一下它的逻辑吗?

这是我的代码:

def sumdiv(n):
  l=[d for d in range(1,int(n/2)+1) if n%d==0] # used n/2 to short loop
  return len(l)+1 # added n itself
trnums=[1,3]

while sumdiv(trnums[-1])<=501:
  k=trnums[-1]-trnums[-2]+1
  trnums.append(trnums[-1]+k)
print(trnums[-2:])

2 个答案:

答案 0 :(得分:0)

如果a

bna * b = n的除数。您可以在不失一般性的情况下设置b >= a。因此a * a是上限;即你只需要考虑到n的平方根。获得a后,您可以轻而易举地推断b

您可以将上限设置为d * d <= n而不是d <= sqrt(n),这样可以避免任何计算平方根。那将会略微加快。

答案 1 :(得分:0)

你只想知道除数的数量:

对于任何数字N,总是存在偶数个除数,因为每个dividor x都需要乘以另一个yN本身是x=sqrt(N)的除数除外如果x*x=N赞成整数结果,那将意味着sqrt(N),这将是唯一的数字。因此,除了def number_of_divisors(n): root = math.sqrt(n) if root == int(root): number = 1 limit = int(root) else: number = 0 limit = int(root) + 1 for i in range(1, limit): if (n % i) == 0: number += 2 return number i = 1 s = 1 while number_of_divisors(s) < 501: i += 1 s += i print(i) # 12375 print(s) # 76576500 print(number_of_divisors(s)) # 576 之外,如果结果为除数,则每个除数都成对分组。

然后你首先检查根是否是一个除数然后计算直到它并且每次加上两个计数,因为其余的总是成对:

public class UnidadOrganicaArbol {

protected long codigo;
@XmlElement(required = true)
protected String denominacion;
protected boolean tieneOficinaRegistro;
protected int prelacion;
@XmlElement(required = true)
protected UnidadesOrganicasArbol subunidades;

/*getters and setters*/
}