Найдите следующее простое число в Python
У меня есть функция, которая принимает число (например, 5) и возвращает первое простое число после введенного числа (в данном случае это будет 7).
Это мой код:
def prime(n):
np=[]
isprime=[]
for i in range (n+1,n+200):
np.append(i)
for x in range(2,199):
for j in np:
if x%j!=0:
isprime.append(x)
return min(isprime)
Однако этот код не работает (всегда возвращает 2). Где ошибка?
8 ответов
У вас есть несколько ошибок, в первую очередь np
явно предназначен для использования в качестве потенциальных простых чисел (он начинается с n+1
которое является первым потенциальным числом, которое соответствует вашему критерию "первое простое число после входного числа"), и все же вы добавляетеx
в ваш основной список, который из range(2,199)
, вы должны использовать:
isprime.append(j)
Ваш тест на простоту также неверен, поэтому вы должны использовать:
j % x != 0
Наконец, вы не можете добавить число, если это условие истинно в одном случае, оно должно быть истинным во всех случаях (где x - целое число, которое удовлетворяет2 <= x < j
), поэтому вам следует переключить второй набор циклов for (x
цикл должен быть внутренним циклом), и вы также должны выполнять цикл только до j-1
(число проверяемых). Кроме того, вы должны вместо этого отказаться от добавления элемента, еслиj % x == 0
:
for ...:
val_is_prime = True
for ...:
if j % x == 0:
val_is_prime = False
break
if val_is_prime:
isprime.append(j)
В результате получается следующий код:
def prime(n):
np=[]
isprime=[]
for i in range (n+1,n+200):
np.append(i)
for j in np:
val_is_prime = True
for x in range(2,j-1):
if j % x == 0:
val_is_prime = False
break
if val_is_prime:
isprime.append(j)
return min(isprime)
И тестовый запуск:
>>> prime(5)
7
>>> prime(13)
17
>>> prime(23)
29
Обратите внимание, что есть несколько других улучшений эффективности, которые можно сделать, но этот ответ фокусируется на ошибках, а не на улучшениях.
Попробуйте этот, самый питонический и понятный способ сделать это, что я нашел (но, вероятно, не самый эффективный):
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(9))
https://www.geeksforgeeks.org/python-simpy-nextprime-method/
from sympy import *
# calling nextprime function on differnet numbers
nextprime(7)
nextprime(13)
nextprime(2)
Вывод:
11 17 3
Этот код рабочий.
def prime(n):
next_prime = n + 1
prime = True
while True:
for i in range(2, next_prime):
if next_prime%i ==0:
prime = False
break
if prime:
return next_prime
else:
next_prime = next_prime + 1
if next_prime % 2 == 0:
next_prime = next_prime + 1
prime = True
if __name__=="__main__":
print(prime(5))
n = int(input("Enter a number"))
while True:
n+=1
for x in range(2,n):
if n%x==0:
break
else:
print("next prime number is",n)
break
def is_prime(n):
# Corner case
if n <= 1:
return False
# Check from 2 to n-1
for i in range(2, n):
if n % i == 0:
return False
return True
def first_prime_over(n):
prime_number = (i for i in range(n) if is_prime(i))
try:
for i in range(0,n):
(next(prime_number))
except StopIteration:
prime_number_next = (i for i in range(n,n+1000) if is_prime(i))
print(next(prime_number_next))
first_prime_over(10)
Вот один рабочий образец.
inputNumber = int(input("Enter number to find next prime: "))
def nextPrime(inputNum):
for nextNumToChk in range(inputNum+1, inputNum +200):
if nextNumToChk > 1:
# If num is divisible by any number between 2 and val, it is not prime
for i in range(2, nextNumToChk):
if (nextNumToChk % i) == 0:
break
else:
#found the prime
return nextNumToChk
result = nextPrime(inputNumber)
print "Next Prime is : ",result
Выход:-
Enter number to find next prime: 5
Next Prime is : 7
Попробуй это:
def find_next_prime(n):
return find_prime_in_range(n, 2*n)
def find_prime_in_range(a, b):
for c in range(a, b):
for i in range(2, c):
if c % i == 0:
break
else:
return c
return None
def main():
n = int(input('Find the next prime number from: '))
print(find_next_prime(n+1))
if __name__ == '__main__':
main()