python-为什么这个项目Euler3解决方案有效?

python-为什么这个项目Euler3解决方案有效?,python,Python,我最近完成了一份报告,上面写着: 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) 现在,我知道这个程序是有效的,但我完全不知道它为什么有效。有人能给我解释一下吗?这个解决方案不正确 当n

我最近完成了一份报告,上面写着:

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)

现在,我知道这个程序是有效的,但我完全不知道它为什么有效。有人能给我解释一下吗?

这个解决方案不正确


当n是一个素数的平方时,例如:4,9,25…,它会失败,因此解释它是如何工作的将是无用的,因为它不工作。

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

while i * i < n:
操作n%i返回n/i的剩余部分。因此,如果n%i==0,那么i的当前值可以平均分为n,即i是n的一个因子

在这里,我们不断地将n除以i;我们将继续进行此除法,直到while条件不再成立为止。我们需要尽可能多地划分,因为这会消除任何可能的复合因素。例如,如果给定的数字是24,我们将它除以2三次,最终使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。

它应该做什么?你不明白什么部分?@Christian-老实说,我想我一点也不懂。为什么你要循环直到我,我觉得这更像是一个数学问题,而不是一个编程问题。所以,你应该问进去。既然你自己也完成了,你能分享你的解决方案吗?这样,我们就可以看到你是如何处理这个问题的,然后试着解释它们的相同点和不同点。它适用于这个问题,但不适用于这个问题。换言之,它是无用的。问题是要制作一个程序,找出一个数的最大素数因子。该实例是查找数字600851475143中的最大素数因子。实际上,你想解决问题,而不是实例。因此,尽管欧拉项目将接受上述解决方案,如果你想学习编程,你应该找一个更好的。@AdamSmith:这基本上和一个答案一样正确,这个答案只是硬编码了答案,没有计算任何东西。@AdamSmith我觉得理解边缘情况以及如何围绕它们编程对于学习如何编程至关重要。一旦你对它们有了很好的理解,并且你在一个非理论的环境中工作,我就会开始做一些事情,比如为某些类型的输入做计划。@SoundDefense同意,我不会称赞这是一个伟大的代码,但对于手头的问题,事实上,正确。如果将第一个while条件更改为i*i,则始终可以得到正确的结果
n = n / i
i = i + 1