【问题标题】:Counting primes [duplicate]计算素数[重复]
【发布时间】:2016-08-05 17:58:36
【问题描述】:

我是编程新手,我在互联网上发现了一个显示第 1000 个素数的问题。但问题是我的代码却有一些问题。

count=0
prime=[]
n=2

while count != 1000:
    if n == 2 or n == 3 or n == 5 or n == 7 or n == 11:
        prime.append(n)
        n=n+1
        count=count+1
    elif n%2 == 0 or n%3 == 0 or n%5 == 0 or n%7 == 0 or n%11 == 0:
        n=n+1
    else:
        prime.append(n)
        n=n+1
        count=count+1

print(prime[999])

当我有一个像 403 这样的数字时,问题就来了。根据我写的代码,它是质数,但实际上并不是因为它可以被 13 和 31 整除。

我想出了一个解决方案,但我不知道该怎么做以及是否有更好的解决方案。如果您帮助我,请尝试保留我的代码,请不要给我全新的代码。

我的解决方案是:

elif n%prime[:]==0
     n=n+1

所以基本上我要做的就是尝试将数字 403 除以我之前记录的任何其他素数。但由于某种原因,这段代码给了我一个错误。我想告诉程序“将 n 划分为列表中的每个数字”。感谢您的帮助:)

【问题讨论】:

  • %prime[:]==0 应该做什么?你的意思是for i in prime: if n % i==0?
  • 是的,但我尝试在不使用“for”命令的情况下这样做

标签: python numbers


【解决方案1】:

您可以使用“任何”。

In [15]: prime = [2, 3, 5, 7, 11]

In [16]: n = 15

In [17]: any(n%p == 0 for p in prime)
Out[17]: True

In [18]: n = 17

In [19]: any(n%p == 0 for p in prime)
Out[19]: False

In [20]: n = 19

In [21]: any(n%p == 0 for p in prime)
Out[21]: False

基本上,它会告诉你给定的数字是否可以被列表中的“任何”数字整除。

【讨论】:

    【解决方案2】:

    有几种计算素数的算法,首先你需要的是如何决定一个函数 isPrime(n) 是返回真还是假,如果你需要这个函数 isPrime(n) 应该在 o(n )。有几种方法可以做到这一点,以下是可能性:

    def isPrime(n):
        i = 2;
    
        while i*i < n:
            if n % i == 0:
                return false
            i = i + 1
        return true;
    

    这个会给你或没有复杂度o(n^1/2),对你来说应该足够了,之后你需要做的下一件事是:

    counter = 0
    number = 2
    while counter < 1000:
        if isPrime(number):
            counter = counter + 1;
        number = number + 1
    print number;
    

    我还没有尝试过这段代码,但这个概念应该在那里

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2019-06-28
      • 2016-03-07
      • 2016-04-21
      • 2020-12-01
      • 1970-01-01
      • 2013-02-13
      • 2021-12-22
      • 2010-09-16
      相关资源
      最近更新 更多