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))
几点题外话:
- 如 user1740577 所述,不要使用
next
作为变量名
- 尽可能避免使用
eval
,这里没问题,但在实际项目中这将导致严重的禁忌。
- 将导入放在脚本的最顶部
- 考虑仅将变量名称
i
和 j
用于迭代。
- 对于重复的
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))
速度大约是原来的两倍
我是 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))
几点题外话:
- 如 user1740577 所述,不要使用
next
作为变量名 - 尽可能避免使用
eval
,这里没问题,但在实际项目中这将导致严重的禁忌。 - 将导入放在脚本的最顶部
- 考虑仅将变量名称
i
和j
用于迭代。 - 对于重复的
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))
速度大约是原来的两倍