Python 试图理解Euler#3项目的解决方案
13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么?@ 我和自己有一个协议,如果我不能解决一个项目Euler问题,我将理解我能找到的最佳解决方案。我确实写了一个算法,适用于较小的数字,但效率太低,无法适用于较大的数字。所以我在谷歌上搜索了答案并开始研究它 这是他的密码:Python 试图理解Euler#3项目的解决方案,python,python-3.x,Python,Python 3.x,13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么?@ 我和自己有一个协议,如果我不能解决一个项目Euler问题,我将理解我能找到的最佳解决方案。我确实写了一个算法,适用于较小的数字,但效率太低,无法适用于较大的数字。所以我在谷歌上搜索了答案并开始研究它 这是他的密码: #!/usr/bin/env python import math def factorize(n): res = [] # iterate over all even
#!/usr/bin/env python
import math
def factorize(n):
res = []
# iterate over all even numbers first.
while n % 2 == 0:
res.append(2)
n //= 2
# try odd numbers up to sqrt(n)
limit = math.sqrt(n+1)
i = 3
while i <= limit:
if n % i == 0:
res.append(i)
n //= i
limit = math.sqrt(n+i)
else:
i += 2
if n != 1:
res.append(n)
return res
print max(factorize(600851475143))
#/usr/bin/env python
输入数学
def factorize(n):
res=[]
#首先迭代所有偶数。
当n%2==0时:
决议草案(2)
n/=2
#尝试奇数到sqrt(n)
极限=数学sqrt(n+1)
i=3
而我
我怀疑+1
与float
的不精确性有关(我不确定这是不是真的需要,或者只是作者的一种防御措施)
第一个while
循环将n
中的所有两个因素都考虑在内。我看不出sqrt(n+1)
将如何适应这里
如果从小因素到大因素,则会自动消除所有组合候选项。想想看:一旦你计算出5
,你就会自动计算出10
,15
,20
等等。无需检查它们是否为素数:到那时n
将不会被它们整除
我怀疑检查素性是破坏原始算法性能的原因。请针对第3点提出问题:任何不是素数因子的值都已经处理了自己的因子;当你到达9
时,3
已经计算出来了。