Python 中的下一个质数

Next Prime Number in Python

我是 Python 的初学者,我正在练习对我看到的这个问题进行编码。需要下一个素数,但输入有限制。我已经搜索过类似的问题,但我的代码仍然无法正常工作。希望你能帮忙。谢谢!

我遇到的问题是当我输入 32 时,结果显示 33 而下一个素数是 37...

到目前为止,这是我的代码。

num = int(input("Enter a positive number:"))   

import math

def nextprime(n):
    if n < 0:
      raise ValueError
  
    for next in range(n + 1, n +200):
        if next > 1:
            for i in range(2, next):
                if (next % i) == 0:
                    break
                else:
                    return next
   

在您的代码中,当您到达一个提示不为零的号码时,您 return 该号码。每个数字都需要一个标志,如果可以将标志转换为 False,则该标志为 True,对于第一个标志不转换为 false return 的数字,如下所示。

不要使用 next 因为这是内置函数。

试试这个:(我不会改进你的代码)

def nextprime(n):
    if n < 0:
      raise ValueError
  
    for i in range(n + 1, n +200):
        if i > 1:
            pr = True
            for j in range(2, i):
                if (i % j) == 0:
                    pr = False
                    break
            if pr:
                return i
    return 'not found'

您也可以尝试此代码,编写函数来检查一个数字是否为质数,例如 def is_prime 然后对于您输入的更大的数字 num 找到下一个数字 min(此回答来自thread。)

def is_prime(x):
    return all(x % i for i in range(2, x))

def next_prime(x):
    return min([a for a in range(x+1, 2*x) if is_prime(a)])

print(next_prime(32))

您也可以像下面这样使用 sympy(这个答案来自 thread。)

from sympy import *
nextprime(32) 
def next_prime(n):
    while True:
        n=n+1
        for i in range (2,int(n/2)):
            if n%i==0:
                break
        else:
            return n


print(next_prime(67)) 

几点题外话:

  1. 如 user1740577 所述,不要使用 next 作为变量名
  2. 尽可能避免使用eval,这里没问题,但在实际项目中这将导致严重的禁忌。
  3. 将导入放在脚本的最顶部
  4. 考虑仅将变量名称 ij 用于迭代。
  5. 对于重复的 except 个块使用 (Error, Error)

关于你的问题的解决方法,稍作调整,如果你不介意的话

def next_prime(n: int) -> int:
    if n < 0:
        raise ValueError('Negative numbers can not be primes')
    # Base case
    if n <= 1:
        return 2
    
    # For i as every odd number between n + 1 and n + 200
    for i in range(n + 1 + (n % 2), n + 200, 2):
        # For every odd number from 3 to i (3 because we covered base case)
        for j in range(3, i, 2):
            # If remained is equals to 0
            if not i % j:
                # break current loop
                break
        # If loop j didn't break [nobreak: ]
        else:
            return i
    raise RuntimeError('Failed to compute next prime number :c')


def main():
    while True:
        try:
            num = int(input('Enter positive number: '))
            print(f'Next prime is: {next_prime(num)}')
            break
        except ValueError:
            print('Please enter a positive integer!')


if __name__ == '__main__':
    main()

对来自@rajendra-kumbar:

的代码进行了一些速度改进
#!/usr/bin/env python

import sys
import time
import math

def next_prime(number):
    if number < 0:
        raise ValueError('Negative numbers can not be primes')
    # Base case
    if number <= 1:
        return 2

    # if even go back 1
    if number % 2 == 0:
        number -= 1
    while True:
        # only odds
        number += 2
        #only need to check up to and including the sqrt
        max_check = int(math.sqrt(number))+2
        # don't need to check even numbers
        for divider in range(3, max_check, 2):
            # if 'divider' divides 'number', then 'number' is not prime
            if number % divider == 0:
                break
        # if the for loop didn't break, then 'number' is prime
        else:
            return number

if __name__ == '__main__':
    number = int(sys.argv[1].strip())
    t0 = time.time()
    print('{0:d} is the next prime from {1:d}'.format(next_prime(number), number))
    run_time = time.time() - t0
    print('run_time = {0:.8f}'.format(run_time))

速度大约是原来的两倍