该函数通过查找其输入的连续因子来工作。它找到的第一个因素必然是素数。找到一个素因数后,将其从原始数中除掉,然后继续该过程。当我们将它们全部分开时(留下 1,或当前因子 (i)),我们已经得到了最后一个(最大的)。
让我们在这里添加一些跟踪代码:
def Euler3(n=600851475143):
for i in range(2,100000):
while n % i == 0:
n //= i
print("Yay, %d is a factor, now we should test %d" % (i, n))
if n == 1 or n == i:
return i
Euler3()
这个的输出是:
$ python factor.py
Yay, 71 is a factor, now we should test 8462696833
Yay, 839 is a factor, now we should test 10086647
Yay, 1471 is a factor, now we should test 6857
Yay, 6857 is a factor, now we should test 1
确实,对于一般的解决方案,范围的顶部应该是 n 的平方根,但是对于 python,调用math.sqrt
返回一个浮点数,所以我认为原始程序员采取了偷懒的捷径。该解决方案通常不起作用,但对于 Euler 项目来说已经足够了。
但算法的其余部分是合理的。