使用Python查找数字是否为素数
可能的重复项:使用Python查找数字是否为素数,python,algorithm,math,primes,Python,Algorithm,Math,Primes,可能的重复项: 我正在研究Euler项目问题10,其状态如下: Find the sum of all the primes below two million. 以下是我的节目: numbers = [] sum = 0 range_number = 2000000 #Appends all numbers in range for i in range(2, range_number): numbers.append(i) #i is every entry in numb
我正在研究Euler项目问题10,其状态如下:
Find the sum of all the primes below two million.
以下是我的节目:
numbers = []
sum = 0
range_number = 2000000
#Appends all numbers in range
for i in range(2, range_number):
numbers.append(i)
#i is every entry in numbers, n is the multiples of numbers[i] starting at one
#value of numbers[i] after i. This is the Sieve of Eratosthenes.
for i in range(0, len(numbers)-1):
if numbers[i] != None:
for n in range(i + numbers[i], len(numbers)-1, numbers[i]):
numbers[n] = None
#Adds all the numbers that are not None
for i in numbers:
if i != None:
sum += i
print(sum)
我的程序将该范围下每个数字的所有倍数都更改为“无”,这将消除所有组合,只留下素数
当我插入一个简单的数字,比如10,我得到了错误的答案。请告诉我哪里出了问题,而不是仅仅发布你自己的程序。
其他帖子提到使用平方根,但我没有真正理解
谢谢。你的问题是你永远不会消除数字中的最后一个数字。如果范围_数为21,则len(数字)为20,len(数字)-1为19。所以这一行:
for n in range(i + numbers[i], len(numbers)-1, numbers[i]):
从不从列表中删除数字20。如果你把清单打印出来,你就可以看到这个。因此,目前,如果range_数比质数多一个,那么您的解决方案会给出正确的答案,但如果range_数比复合数多一个,则会被range_数-1关闭
要解决该问题,只需将行更改为:
for n in range(i + numbers[i], len(numbers), numbers[i]):
这不可能是您的实际代码;不能将整数赋给
范围
,然后尝试调用范围()
。你没有得到错误的答案,你会得到一个异常,告诉你整数是不可调用的。你是对的,我只是为了清楚起见添加了变量。谢谢,我会修正的。那篇文章上的函数是素数(a)是不同的,它会检查每一个小于输入值的数字,如果它是一个因子,这对我的程序来说太长了。为什么你要对范围(2,范围)中的I使用:数字。附加(I)
而不是数字=范围(2,范围\u数字)
(或数字=列表(range2,range_number))
适用于较新的蟒蛇)?我想这也行,谢谢。我终于得到了正确的答案,即142913828922。非常感谢。