这1000个素数代码的问题是什么?

时间:2017-07-06 01:52:01

标签: python python-2.7

count=5 #Nth prime number
i=10  #number to be checked
while (count!=1000):  #until its not 1000th
 if i%2==0 or i%3==0 or i%5==0 or i%7==0:  #to check non prime
  i=i+1 #next number initialized
 else: #for prime
  count=count+1 #move to next position
if count==1000: #if is 1000th position 
 print i," is 1000th prime." #print prime

我正在考虑2,3,5,7已经被称为素数,从10开始。

它给出" 11是第1000个素数"作为输出。 我想,某处存在逻辑错误。

3 个答案:

答案 0 :(得分:2)

正如其他人在评论中提到的那样,判断一个数字是否为素数的标准是非常错误的。您只测试它是否可以被前4个素数整除,但这对于大于120的数字是不够的(121可以被11整除,但不能被任何较小的素数整除)。您需要检查之前找到的所有素数(查看" Eratosthenes筛选")。

另一个问题是,当数字为素数时,您不会递增i。因此,一旦到达11,您就会继续count,而不是i。当count到达1000时,您打印i作为第1,000个素数。从i = i + 1块中取出if,每次都应该这样做。

此外,由于偶数数字永远不会是素数(2除外),您可以从i = 11开始并将其递增2 - 不要浪费时间检查偶数。然后你可以将i % 2 == 0从测试中拿走。

答案 1 :(得分:0)

143是11 * 13所以它不是素数。 您的代码会将其视为素数,因为您只检查它是否可以除以前5个素数。 为了解决你的疑问,我只是将下一个乘以素数11和13。 希望能帮助到你。

顺便说一下,你的代码也是错误的,因为它只会增加" i"当它与条件匹配时,所以当它始终检查时:     如果11%2 == 0或11%3 == 0或11%5 == 0或11%7 == 0:

您的代码的解决方案(不计算第1000个素数):

count=5 #Nth prime number
i=10  #number to be checked
while (count!=1000):  #until its not 1000th
    if i%2==0 or i%3==0 or i%5==0 or i%7==0:  #to check non prime
        pass #next number initialized
    else: #for prime
        count=count+1 #move to next position
    i=i+1
if count==1000: #if is 1000th position 
    print i-1," is 1000th prime." #print prime

解决您的问题:

def is_prime(n):
  if n == 2 or n == 3: return True
  if n < 2 or n%2 == 0: return False
  if n < 9: return True
  if n%3 == 0: return False
  r = int(n**0.5)
  f = 5
  while f <= r:
    if n%f == 0: return False
    if n%(f+2) == 0: return False
    f +=6
  return True

count=5 #Nth prime number
i=10  #number to be checked
while (count!=8):  #until its not 1000th
    if not is_prime(i):  #to check non prime
        pass #next number initialized
    else: #for prime
        count=count+1 #move to next position
    i=i+1
if count==8: #if is 1000th position
    print i-1," is 1000th prime." #print prime

函数is_prime(n)来自isPrime Function for Python Language

答案 2 :(得分:0)

  1. 您编写的用于计算素数的逻辑是错误的。我想你可以存储你在之前的测试中计算的所有素数,然后通过除以所有先前的素数来测试下一个数字,或者只是根据素数的定义测试下一个数字
  2. 在循环中,如果i == 11,那么你将增加计数器,但是,我不会增加,所以对于后续循环,你将只测试11是素数。这就是为什么你打印11作为第1000个数字的原因。实际上,您将打印11作为第N个素数。我认为你应该总是增加i