Код для вывода простых и не простых чисел


Этот код я взял с книги.


Это мой вариант.

1)Я не понимаю, для чего в коде с книги есть переменная b, она вроде как должна ограничивать выполнение 2- го блока, но в моем варианте его нет, а результат тот же. Отсутствие\присутствие оператора b влияет на работу кода?

2)в варианте с книгой (21 строка: a = a +2)
в моем(a = a + 1)
в каком случае результат лучше?

3)Можно ли оптимизировать код, сделать его выполнение быстрее.

P.S. я учу первый язык, по этому могу нарушать терминологию, исправьте, если ошибся. :]

  1. Так где тот же результат, если вы про одно и то же число печатаете, что оно и простое и не простое?
  2. Начальное значение a нечетное. А любое четное число кроме 2 является не простым. Поэтому нет смысла проверять на простоту четные числа. Вот их и “перескакивают”.
  3. Ну питон это не про скорость. Я не понял, зачем автор книги делает цикл от 2 до a - 1, а потом только внутри сравнивает с корнем. Цикл все равно будет крутиться до конца, так как в коде нет break. Можно попробовать убрать переменную b, воспользовавшись веткой else для цикла for. В текущем виде смысл переменной count мне тоже непонятен. Или автор хотел использовать разные циклы для наглядности, или переносы в коде пострадали, из-за чего изменился смысл кода.
1 симпатия

1)Результат не сверил, :]
2) Понял
3)Не понял, от чего до чего? Можно по подробнее немного :sweat_smile:

count должен ограничивать количество выполненных циклов, наверно.

Из википедии:

число x является простым, если оно больше 1 и при этом делится без остатка только на 1 и на x

Поэтому логично проверять делимость только на оставшиеся числа (от 2 до x - 1). Но можно заметить, что у каждого делителя есть пара (например, x делится на 2 и на x/2). Если не нашли из такой пары наименьший делитель, то наибольшего делителя тоже нет. Поэтому проверять имеет смысл только от 2 до корня из x. Но в текущем коде хоть и присутствует сравнение с корнем, но нет преждевременного выхода из цикла (например, для x = 100 будет проверено 98 чисел, хотя можно было проверить только 9).

Да, он ограничивает. Но если судить по начальному значению count, автор хотел получить первые N простых чисел. Но в текущем виде получилось, что проверяются первые N - 2 нечетных чисел, среди которых отбираются простые. Поэтому я предполагаю, что пострадали переносы, и код count = count + 1 должен был быть внутри if над ним.

1 симпатия
a = int(input("Введите число: "))
k = 0
for i in range(2, a // 2+1):
    if (a % i == 0):
        k = k+1
if (k <= 0):
    print("Число простое")
else:
    print("Число не является простым")

нашел в интернете.
3 строка) a // 2 + 1 чтобы питон не проверял
2 половину числа, например:
a = 61 если, если питон проверяет 2 часть числа(от 32 - 61) то это бессмысленно, так как 100% делится нацело числами находящиеся от 1% до 50%, а начиная
от 51% до 99% число нацело не делится.
Это верное суждение?

Да. Но можно еще сильнее сократить перебор, если идти до корня.

1 симпатия


x = 5
как работает команда цикла for…in
for i in range (2, 3) # начальное число включительно, а конечное не включительно, верно?
если в i несколько аргументов(как правильно называть? :] )
то они поочередно участвуют в блоке for?
то есть в строке подставляется первое число i = 2
if (x % i == 0)
условие не выполнено и подставляется следующие число, это так работает?
А, если условие выполняется первым числом i, то остальные значения i подставляются или код дальше выполняется?

P.S. почему код выводит 11 число не простое?

Да.

i поочередно принимает значения, которые сгенерировал range. Тело цикла будет выполняться для каждого значения.

Поскольку нет break в теле цикла, то будут подставляться все значения.

Потому что k надо сбрасывать в 0 перед циклом for.

Используйте для отступа хотя бы 2 пробела, а то тяжело воспринимается код. Внешний while можно заменить на for _ in range(a - z): (если не ошибся в количестве повторений).

1 симпатия

Написал такой код, вечером попробую написать с использованием sqrt.

Предела совершенству нет - улучшать и переписывать код можно бесконечно. Но 2 момента укажу:
Присваивать k = 0 можно один раз перед for, вместо 2 раз (перед while и после for).
Нет смысла писать elif (k != 0):, так как вариантов всего два (равно или не равно), можно просто написать else.