Нужно написать функцию, которая возвращает первое простое число большее числа num
Нужно написать функцию get_next_prime(num), которая принимает в качестве аргумента натуральное число num и возвращает первое простое число большее числа num
Мой нерабочий код:
# объявление функции
def is_prime(num):
len([i for i in range(1, num+1) if num % i == 0]) == 2
def get_next_prime(num):
while is_prime(num) == False:
num += 1
return
# вызываем функцию
print(get_next_prime(int(input())))
Ответы (1 шт):
У вас чуть не в каждой строке ошибка, поэтому разберу несколько фрагментов:
def is_prime(num):
len([i for i in range(1, num+1) if num % i == 0]) == 2
Данная функция не возвращает результат проверки. Нужно добавить return перед условием.
def get_next_prime(num):
while is_prime(num) == False:
num += 1
return
Функция ничего не возвращает (т.е. возвращает None), нужно возвращать num. Кроме того, саму проверку нужно написать по-другому. Никто обычно не сравнивает с True и False, а пишут просто if ... для проверки на True или if not ... для проверки на False. Так код понятнее.
print(get_next_prime(int(input())))
И даже тут у вас ошибка - нужно вернуть "первое простое число большее числа num", но в вашем коде если введённое число простое, то вернётся оно же. Где-то нужно прибавить 1 к введённому числу.
Итого, после коррекции всех ошибок, рабочий код:
# объявление функции
def is_prime(num):
return len([i for i in range(1, num+1) if num % i == 0]) == 2
def get_next_prime(num):
while not is_prime(num):
num += 1
return num
# вызываем функцию
print(get_next_prime(int(input()) + 1))
Это я ещё не оптимизировал сам перебор делителей, который, как вам уже написали, можно вести до корня из числа, этого достаточно (но и сравнивать кол-во делителей тогда нужно будет не с 2, а с 1). Потому что если у числа есть делитель больший, чем его корень, то есть и другой делитель, меньший корня и он найдётся при таком переборе до корня. И если сделать обычный цикл, а не списковое включение, то при нахождении делителя можно было бы завершить цикл досрочно через break или return, а не проходить обязательно весь range. Оптимизированный код проверки:
def is_prime(num):
for i in range(2, int(num**0.5) + 1):
if num % i == 0:
return False
return True