python - 为什么这个Project Euler#3解决方案有效?

时间:2014-07-26 21:30:41

标签: python

我最近完成了Project Euler problem, number 3,其中说:

  

13195的主要因素是5,7,13和29。

     

600851475143号码的最大主要因素是什么?

当我遇到这个时,我正在寻找其他人的解决方案。

n = 600851475143  
i = 2

while i * i < n:
    while n%i == 0:
        n = n / i
    i = i + 1

 print (n)

现在,我知道这个程序有效,但我不知道它为什么会起作用。有人可以帮我解释一下吗?

2 个答案:

答案 0 :(得分:2)

所以看一下这个程序,似乎得到n的所有主要因素并返回最大的因子。让我们一次一行:

while i * i < n:

这段特殊的代码起初看起来像是一个错误,但是当你意识到n不断变小时它会起作用。该程序使用重复除法将n减少到其最大素数因子。

while n%i == 0:

操作n % i返回n / i的剩余部分。因此,如果n % i == 0,那么i的当前值可以均分为n,即in的因子。

n = n / i

在此,我们不断将n除以i;我们将继续进行这种划分,直到while条件不再成立。我们需要尽可能多地划分,因为这样可以消除任何可能的复合因素。例如,如果我们给定的数字是24,我们将它除以3三次,最终使n等于3.这消除了任何可能的复合因子,即2的倍数。

i = i + 1

增加我们的数量并重复。

这很有效,因为通过重复使用n = n / i,我们将从n中逐渐删除较大的素数因子。我们消除的这些素数因子越多,n越小,直到最终除了1之外的任何东西都不可分割。此时,n等于原始数字的最大素数因子,并且所以我们回来了。

现在我们的停止条件也更有意义。在n成为素数(最大素数因子)时,我们可以生成的i值不会被平均整除。我们会在i * i大于n时知道这一点 - 如果您有一个综合数字,那么其中一个因素必然是>= n^1/2

正如Ionut Hulub所提到的,如果n是任何完美的正方形,这个特定的解决方案将失败。为防止出现这种情况,您应该打印出n和平均分割数量最大的i

答案 1 :(得分:1)

该解决方案不正确。

当n是素数的平方时(例如:4,9,25 ......),它失败了,所以解释它是如何工作的将是没用的,因为它不起作用。