我的问题是要找到最大的素数因子600851475143。
代码:
class Prime:
def isPrime(self,n): # Checks if number is prime
number=n
flag=0
#code to exclude 1 nd 2 from check
if number==1:
return False
elif number==2:
return True
#code to loop through and check if number is divisible
for i in range(2,(number/2)+1):
if (number)%i==0:
flag=1
break
else:
flag-0
continue
#code to return result
if flag==0:
return True
elif flag==1:
return False
但是这段代码抛出了一个溢出错误 - “OverflowError:range()结果有太多的项目”。我能做些什么来处理一个大数字?
我按照“Python long integer input”的建议尝试使用n = int(raw_input())
,
但没有运气!
def main():
p=Prime()
n = int(raw_input())
print p.isPrime(n)
答案 0 :(得分:0)
问题是数字的数量,而不是尺寸。您为600851475143/2元素构建了一个range
对象。单个单词整数就会消耗超过1TB的内存。由于您使用的是大整数,因此会占用更多内存。你有多少地址空间做?
减少所需元素的大小。首先,您只需要通过数字的平方根来检查以完成素数因子分解。其次,您不必构建生成器:只需增加变量,完全消除结构。最后,您只需要按素数除以,而不是所有数字。
第一步:
for i in range(2, int(math.sqrt(number))+1):
while number % i == 0:
number = number // i
largest = i
当您完成后,最大的素数因素是number
和largest
中的较大者。
第二步:
将该大range
表达式转换为简单的变量增量:
i = 2
upper = int(math.sqrt(number) + 1)
while i < upper:
while number % i == 0:
number = number // i
largest = i
i +=1
你可以通过只做2而不是奇数来加速2倍。
算法改进:
建立一个筛子或其他方法来跟踪素数。通过那些而不是通过所有整数来迭代。