65.9K
CodeProject 正在变化。 阅读更多。
Home

计算第 N 个质数

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (5投票s)

2018年2月3日

CPOL

2分钟阅读

viewsIcon

18333

如何计算第 N 个质数

引言

我最近开始自学Python课程。这与我之前的所有文章大相径庭,那些文章都是用C++和MFC编写的。我想学习最新的编程技术,而Python是一个很好的选择。我仍然对Python非常陌生。课程中的一个环节要求我创建一个素数生成器。我对演示的代码不满意,所以决心对其进行优化。

这个脚本用于计算第N个素数。在课程学习过程中,演示了Python类,我对这个主题非常熟悉,因为它与C++非常相似。我所做的优化之一是跳过偶数的检查。根据定义,偶数永远不能是素数,因为它们总是可以被2整除。

什么是素数?素数是大于1且只能被1或自身整除的数。数字2是素数,因为它大于1且只能被2整除。3、5和7也是素数,原因相同。

背景

我正在使用的在线培训课程的网址是 https://www.youtube.com/watch?v=Vxw1b8f_yts

Using the Code

要使用这段代码,创建一个CPrime对象,并指定所需的第N个素数。计算素数的的基本思想是从2到该数减1进行循环。该脚本使用外层循环和内层循环来实现这一点。外层循环计算已经发现的素数数量,并在发现第N个素数时退出。内层循环初始化为两个数字。第一个数字是“i”,代表要检查是否为素数的数字。第二个数字是从2到素数减1的计数器。为了测试是否为素数,将第二个计数器对第一个数字进行模运算除法。如果存在余数,则该数字是素数的候选者,计数器会增加并重新检查。如果没有余数,则该数字不是素数的候选者。第一次优化是在发现一个数不是素数时跳出内层循环。第二次优化确保只测试奇数。

例如

# Calculate the 10th prime number
MyPrime = CPrime(10)
print(MyPrime.GetPrime())

整个脚本

"""
This script calculates a prime number
"""

# Base class
class CCalculate:
    def __init__(self):
        pass

    def IsEven(self, num):
        if num % 2 == 0:
            return True
        return False

# Derived class
class CPrime(CCalculate):
    def __init__(self, nthPrime):
        self.nthPrime = nthPrime

    # return the nth Prime number
    def GetPrime(self):

        nthPrime = self.nthPrime
        counter = 0
        i = 2

        while counter < nthPrime:
            bPrime = True
            j = 2

            while j < i:
                if i % j == 0:
                    bPrime = False
                    break
                else:
                    j = j + 1
            
            if bPrime is True:
                counter = counter + 1

            # Increase the number
            i = i + 1

            # if the next iteration does not finish the loop or
            # it is an even number, then increase it to make it odd
            if counter < nthPrime and self.IsEven(i) is True:
                i = i + 1

        return i - 1

关注点

我学习了Python类,它与C++类有一些细微的差别。Python派生类的构造函数需要手动调用以进行基类初始化。

历史

  • 2018年2月3日 - 脚本提交
© . All rights reserved.