Python

Помогите понять г*вно ли код? Необходимо написать программу, которая определяет число просто или составное.

x=int(input())
if x==1:
****print("Число не является ни простым, ни составным")
divisor=2
while x!=divisor!=0 and x!=divisor:
****if x%divisor==0:
********print("Число составное")
********break
****divisor+=1
else:
****print("Число простое")
Дико неэффективный код. 1) Проверять надо не дальше, чем до квадратного корня из числа - код зачем-то проверяет до самого числа; 2) Не надо повторно делить на числа, кратные простым - данный код метелит всё подряд.
Есть куча нормальных алгоритмов, достаточно реализовать любой из них. Хоть даже решето Эратосфена - будет всяко лучше, чем вот это вот.
СГ
Сергей Гольцев
48 068
Лучший ответ
Михаил Тахиров И зачем вдруг решето? Задача вообще в другом заключается.
Нужно определить простое ли единственное число, а не найти все простые в диапазоне..
Это плохой код хотя бы потому, что делители проверять нужно вплоть до квадратного корня из заданного числа, а не до самого числа. Понятно, что 100 не будет делиться нажело уже на 51, верно? Значит, половина (на самом деле - больше) твоих проверок уже лишняя. Втотой момент заключается в том, что если надо будет проверить несколько чисел, проверка будет осуществляться каждый раз от начала и до конца - решето Эратосфена в этом случае было бы гораздо эффективнее, чем перебор каждый раз.
У меня такой вариант. Работает, но говорят что не самый оптимальный с точки зрения математики. Без решета Эратосфена. Зато сам придумал...
 def prime_or_composite(n):

if n == 1: return False

test = True

k = n - 1

while k > 1:

if not n % k:

test = False

break

k -= 1

return 'prime' if test else'composite'



print(prime_or_composite(11))

print(prime_or_composite(12))

print(prime_or_composite(53))

print(prime_or_composite(60))

print(prime_or_composite(61))

print(prime_or_composite(62))

Мустафа Сурапбаев с точки зрения логики тоже так себе вариант. лучше булев тип возвращать и назвать как-нибудь "is_prime_number"
Илья Данилов так это тот же перебор в лоб всех чисел, только с циклом вайл?
Для новичка пойдет. Чисто в лоб без единой оптимизации.
Четные числа сразу - не простые, без всяких циклов (кроме двойки)
В цикле проверять только нечетные. И шаг не 1, а 2, только по нечетным делителям. Нечетные числа делятся только на нечетные.
Правильно выше написали, предел проверки квадратный корень из числа, а не само число.
Юрий Фенин
Юрий Фенин
55 095
Тимур Тасбергенов получается, код будет длиннее, но работать быстрее, если проверку проводить до корня из числа, отбрасывая все чётные?
Просто мой вариант, не эталон..
 num = int(input())  
is_prime = True
if num % 2:
div = 3
while div**2
Алтай Лаура
Алтай Лаура
18 091

Похожие вопросы