我已编写此代码来解决Euler 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:])
答案 0 :(得分:0)
a
, b
和n
是a * b = n
的除数。您可以在不失一般性的情况下设置b >= a
。因此a * a
是上限;即你只需要考虑到n
的平方根。获得a
后,您可以轻而易举地推断b
。
您可以将上限设置为d * d <= n
而不是d <= sqrt(n)
,这样可以避免任何计算平方根。那将会略微加快。
答案 1 :(得分:0)
你只想知道除数的数量:
对于任何数字N
,总是存在偶数个除数,因为每个dividor x
都需要乘以另一个y
,N
本身是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*/
}