【问题标题】:Finding if a number is prime using Python [duplicate]使用Python查找数字是否为素数[重复]
【发布时间】:2011-09-27 03:46:54
【问题描述】:

可能的重复:
Fastest way to list all primes below N in python
Checking if a number is a prime number in Python

我正在研究 Project 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)

我的程序将范围内每个数字的所有倍数更改为无,这应该消除所有复合并只留下素数。

当我为 range_number 插入一个简单的数字(例如 10)时,我得到了错误的答案。不要只发布你自己的程序,请告诉我哪里出错了。 其他帖子提到使用平方根,但我并没有真正理解。

谢谢。

【问题讨论】:

  • 这不可能是你的实际代码;您不能将整数分配给range,然后尝试调用range()。你不会得到错误的答案,你会得到一个异常,告诉你整数是不可调用的。
  • 你说得对,为了清楚起见,我只是添加了变量。谢谢,我会解决的。
  • 该帖子上的函数 is_prime(a) 不同,它检查每个小于输入的数字是否是一个因子,这对我的程序来说太长了。
  • 你为什么使用for i in range(2, range_number): numbers.append(i)而不是numbers = range(2, range_number)(或者numbers = list(range2, range_number))对于较新的Python)?
  • 猜猜也行,谢谢。

标签: python algorithm math primes


【解决方案1】:

您的问题是您永远不会消除数字中的最后一个数字。如果 range_number 为 21,则 len(numbers) 为 20, len(numbers)-1 为 19。所以这里的这一行:

for n in range(i + numbers[i], len(numbers)-1, numbers[i]):

从不真正从列表中删除数字 20。如果您打印了列表,您可能已经看到了这一点。因此,目前如果 range_number 比质数大一,您的解决方案会给出正确答案,但当 range_number 比复合数大一时,它会被 range_number-1 关闭。

要解决这个问题,只需将行更改为:

for n in range(i + numbers[i], len(numbers), numbers[i]):

【讨论】:

  • 我终于得到了正确的答案,即142,913,828,922。谢谢!
猜你喜欢
  • 2023-04-05
  • 2021-04-20
  • 2020-07-19
  • 2015-03-17
  • 2011-05-06
  • 1970-01-01
  • 2020-09-20
  • 2015-09-30
  • 2012-10-08
相关资源
最近更新 更多