Нужно написать функцию, которая возвращает первое простое число большее числа 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 шт):

Автор решения: CrazyElf

У вас чуть не в каждой строке ошибка, поэтому разберу несколько фрагментов:

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
→ Ссылка