我最近完成了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)
现在,我知道这个程序有效,但我不知道它为什么会起作用。有人可以帮我解释一下吗?
答案 0 :(得分:2)
所以看一下这个程序,似乎得到n
的所有主要因素并返回最大的因子。让我们一次一行:
while i * i < n:
这段特殊的代码起初看起来像是一个错误,但是当你意识到n
不断变小时它会起作用。该程序使用重复除法将n
减少到其最大素数因子。
while n%i == 0:
操作n % i
返回n / i
的剩余部分。因此,如果n % i == 0
,那么i
的当前值可以均分为n
,即i
是n
的因子。
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 ......),它失败了,所以解释它是如何工作的将是没用的,因为它不起作用。