我正试图找到一个数字的最大素数因子。这是我的代码,但我不知道我的代码是否正常工作,因为我一直在收到MemoryError;
lst = []
for x in range(3,round(600851475143**0.5)+1):
for y in range(2,x+1):
if x%y==0:
for z in range(2,x+1):
if x%z!=0:
lst.append(x)
print (max(lst))
这是追溯;
>>>
Traceback (most recent call last):
File "C:--------", line 19, in <module>
lst.append(x)
MemoryError
>>>
经过20-30秒的过程,我收到了这个错误。如何避免这个错误?
编辑:实际上,我猜它可能是MemoryError,所以当你看到我放入第一个range
函数时,该数字600851475143**0.5
的平方根。然后我使用round
来避免float
。但我仍然得到了MemoryError。
答案 0 :(得分:1)
if x%y==0:
for z in range(2,x+1):
if x%z!=0:
lst.append(x)
我猜你在这里要做的是,如果x是素数,请将x
附加到lst。但是你实际上在做的是,将x
追加到每个小于x的数字,而不是x的因子。防爆。 6将被追加两次,因为4和5都不是6的因子。
如果您只想在所有 z不是x的因子时附加x
,请尝试:
if x%y==0:
if all(x%z != 0 for z in range(2, x)):
lst.append(x)
答案 1 :(得分:0)
来自python文档:
异常MemoryError
当操作耗尽内存时引发,但情况仍然可能被挽救(通过删除一些对象)。关联值是一个字符串,表示内存中耗尽了哪种(内部)操作。请注意,由于底层内存管理体系结构(C的malloc()函数),解释器可能无法始终从这种情况中完全恢复;然而它引发了一个异常,以便可以打印堆栈回溯,以防止失控程序。
你在lst
中添加了太多元素。
有效的素数因子分解算法比您编写的算法更有效,可以在wikipedia上查找。