【发布时间】:2020-04-09 18:55:58
【问题描述】:
我是初学者。我的Project Euler Problem No. 3 解决方案需要永远返回答案。有人可以建议改进吗?我究竟做错了什么?我已经编写了一些代码来帮助我思考问题的所有谜题。
13195 的质因数是 5、7、13 和 29。
600851475143 的最大质因数是多少?
#limiter identification for iteration
def limiter(x):
for i in range (2, x):
if x % i == 0:
return int (x/i)
#Prime checker
def is_prime(a):
for i in range (2, a):
if a % i == 0:
return False
return True
#Lists all factors of a given no.
def factorlist(b):
list = []
for i in range (2, limiter(b)+1):
if b % i == 0:
list.append(i)
return list
#Lists all prime factors of a given no.
def primefactor(p):
plist = []
for i in factorlist(p):
if is_prime(i)== True:
plist.append(i)
return plist
print (primefactor(600851475143)[-1])
【问题讨论】:
-
对于此类问题,查看您知道答案的较小案例总是有帮助的。这个程序是否真的为小数字返回正确的结果?
-
是的,确实如此。如果我只是取出输入的最后一位,它会很快给出正确的结果。添加最后一位数字似乎会导致延迟。
-
1)
limiter背后的想法是什么? 2) 当您检查它是否是素数时,您只需要迭代直到sqrt(a)(如果一个除数大于sqrt(a),另一个小于)。不确定这是否是唯一的问题,但肯定会更快。 -
一旦你有一些基本可以工作的东西并且你想让它更快,试着写下它为一个小案例所遵循的步骤。有没有重复的?如果是这样,有没有办法可以避免做一些重复?对于典型的早期欧拉问题(实际上是计算机科学中的大多数问题),每一步都应该让你得到一个答案,并为你留下相同问题的较小版本,直到最后一步给你最后一个答案。跨度>
-
我没有想到 sqrt(a)。谢谢它应该大大减少计算。再告诉我一件事;我将输入的所有因素附加到一个列表中,然后使用迭代检查是否为素数。如果素数则附加到另一个列表并最终返回最后一项。这种方法内存效率高吗?有没有其他更好的方法。我相信递归会带来类似的内存问题。