计算千分之素数

时间:2019-07-12 17:25:20

标签: python primes

问题要求计算第1000个素数。我正在尝试解决此问题,但我被卡住了。

有一些解决问题的准则。

为帮助您入门,以下是您可能应该遵循的阶段的粗略概述 编写代码:

  1. 初始化一些状态变量
  2. 生成所有大于1的(奇数)个整数作为素数
  3. 对于每个候选整数,测试其是否为素数
  4. 一种简单的方法是测试是否均匀地分配了其他任何大于1的整数 用零除候选者。为此,您可以使用模块化 算术运算,例如,表达式a%b返回后面的余数 将整数a除以整数b。
  5. 您可能会考虑需要将哪些整数用作除数– 当然,您不需要超越正在检查的候选人,但是您可以多久停止检查呢?
  6. 如果候选人是最主要的人,请打印一些信息,以便您知道自己的位置 在计算中,并更新状态变量
  7. 在达到适当的结束条件时停止。在制定这个 在这种情况下,请不要忘记您的程序没有生成第一个素数(2)。 使用这些想法来指导代码的创建。

到目前为止,我的尝试是

def calculate_thousandth_prime():
    j = 0
    for i in range(3,int(10e6)):
        if i%2 != 0:
            counter = 0
            for k in range(1, i):
                if i%k != 0:
                    counter += 1
            if counter == 0:
                print("This candidate is prime")
                j += 1
        if j == 1001:
            print("The number "+str(i)+" is the thousandth prime")
            break
    return 0

calculate_thousandth_prime()

我的代码卡在i%k != 0上。我一定做错了什么...有帮助吗?

3 个答案:

答案 0 :(得分:2)

您有两个问题:

首先,您正在搜索for k in range(1, i):。因为每个数字(包括质数)都可以被1整除,所以您找不到任何质数。尝试改为搜索range(2, i)

第二,您正在检查if i%k != 0:。您应该改为检查i%k == 0。如果i可被任何数字k整除,则该数字为 not 质数。

实际上,我发现了第三个问题:您有一个错误的错误。通过初始化j=0,您的代码会将其发现的第一个素数视为“零”素数。该代码将输出千位素数而不是千分之一素。

答案 1 :(得分:1)

我所做的更改:

  1. 更改范围以添加2步骤以更自然地跳过偶数。
  2. 检查您的内部循环,您需要除以值range(2, i//2)。除以大于i//2的值将小于2。
  3. 更改主检查,以查看上述范围内是否有任何数字相除。如果是这样,我们知道这个数字是错误的。此时,我们可以移至下一个数字。
  4. 我们要在素数计数器为1000时返回,而您正在返回第1001个素数。
def calculate_thousandth_prime():
    prime_counter = 0
    for i in range(3,int(10e6),2):
        prime = True
        for k in range(2, i//2):
            if i % k == 0:
                prime = False
                break
        if prime:
            print(str(i) + " is prime")
            prime_counter += 1
        if prime_counter == 1000:
            print("The number "+str(i)+" is the thousandth prime")
            break
    return i

calculate_thousandth_prime()

答案 2 :(得分:0)

Eratosthenes的筛网通常是早期素数的最快方法。您可以对其进行调整以达到第n个素数。

例如:

def nthPrime(N):
    sieve = [1]*(N**2)
    p     = 2
    for _ in range(N):
        while not sieve[p]: p += 1
        sieve[p::p] = [0]*len(sieve[p::p])
    return p

nthPrime(100) # 541

素数列表除数检查方法可能更容易编写和理解,但速度慢得多(尽管对于仅1000个素数,这没有多大区别):

def nthPrime(N):
    primes = [2]
    p = 1
    while len(primes)<N:
        p += 2
        primes += [p]*all(p%d for d in primes)
    return p