@Smeilz1
За любое развитие

Почему в цикле срабатывает or вместо and?

Добрый день. Пишу программу, которая выводит число, которая делится на оба числа без остатка.
Не понимаю почему в цикле while срабатывает логическая операция or, ведь должно быть and.
Пока 'переменная d не станет делиться без остатка на первое введенное нами число' И 'переменная d не станет делиться без остатка на второе введенное нами число', ТО выполняем цикл. Ну почему тогда тут "ИЛИ" применяется? Хотя по смыслу должно быть "И"?
a = int(input())
b = int(input())
d = 1
while d % a != 0 or d % b != 0: 
    d = d + 1
print(d)
  • Вопрос задан
  • 513 просмотров
Решения вопроса 3
@DarkRider
Full stack web developer
Потому, что смысл алгоритма в том, что d увеличивается до тех пор пока, он не будет делиться без остатка на a и b. while заканчивается по False. Таким образом надо сконструировать выражение дающее False тогда, когда d является делителем a и b. То есть инверсию того условия, о котором Вы подумали.
Ответ написан
Комментировать
bonv
@bonv
Пока 'переменная d не станет делиться без остатка на первое введенное нами число' И 'переменная d не станет делиться без остатка на второе введенное нами число', ТО выполняем цикл.

Нет, утверждение неверное.

Цикл while работает пока условие истинно. В вашем случае либо истино d % a != 0, либо истинно d % b != 0

В ruby есть until, который работает так как вы описали
Ответ написан
Комментировать
adugin
@adugin Куратор тега Python
Если это не лабораторная работа, где принципиален перебор "в лоб", то:
from math import gcd
lcm = a * b / gcd(a, b)

Ну и просто для прикола - реализация аналогичного цикла через итераторы:
from itertools import count, dropwhile
lcm = next(dropwhile(lambda d: d % a != 0 or d % b != 0, count(max(a, b))))

Обратите внимание, что перебор лучше начинать с max(a, b), а не с 1 (если числа натуральные)

P.S. LCM = Least Common Multiple
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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