Условие задачи
Для решения будем также использовать метод перебора, но стартовать будем с числа 2520 т.к меньшим кратное от 1 до 20-ти быть не может
2520 - самое маленькое число, которое делится без остатка на все числа от 1 до 10.
Какое самое маленькое число делится нацело на все числа от 1 до 20?
Скажу сразу - не смотря на не большой диапазон чисел условия реализация этой задачи получилась громоздкой и ее выполнение занимает больше всего времени - около 90 с несмотря на все попытки оптимизации.
Решение
Используемые мной параметры
i=2520
c=False
r=(3,4,6,7,8,9,11,12,13,14,15,16,17,18,19)
коллекция r хранит числа, по которым мы будем проверять делимость. Сразу скажу i при каждом проходе цикла будет иметь прирост +10. Это связано с тем что
а. Числа должны быть четными чтобы делится на 2
б.Числа должны иметь в конце 0 чтобы делится на 10 и 20
Это самые тривиальные признаки делимости числа (остальные требуют недетских вычислений).
Соотвественно из коллекции r убираем 1,2, 10, и 20. Да, признак делимости на 5 это окончание 0 и 5. У нас i всегда оканчивается на 0 так что 5 тоже убираем.
Полный текст программы
i=2520 #Делимость на 20
c=False
r=(3,4,6,7,8,9,11,12,13,14,15,16,17,18,19)
while c is False:
str(i)
for j in r:
if i%j==0:
c=True
continue
else:
c=False
break
i+=10 #Только четные
print(i-10)
Цикл for выполняется до тех пор пока числа из коллекции делят нацело i, Если хотя бы одно число не поделило i возвращается c=False, прибавляем 10 к i и идем повторяем for с новым значением i и так пока все числа из коллекции не поделят i. Только тогда c=True по окончанию for и While завершится на первом таком значении, которое и будет наименьшим кратным.
Конечно алгоритм не претендует на оптимальность и есть место для разгона,может быть читатель предложит более оптимальное решение
а. Числа должны быть четными чтобы делится на 2
б.Числа должны иметь в конце 0 чтобы делится на 10 и 20
Это самые тривиальные признаки делимости числа (остальные требуют недетских вычислений).
Соотвественно из коллекции r убираем 1,2, 10, и 20. Да, признак делимости на 5 это окончание 0 и 5. У нас i всегда оканчивается на 0 так что 5 тоже убираем.
Полный текст программы
c=False
r=(3,4,6,7,8,9,11,12,13,14,15,16,17,18,19)
while c is False:
str(i)
for j in r:
if i%j==0:
c=True
continue
else:
c=False
break
i+=10 #Только четные
print(i-10)
Цикл for выполняется до тех пор пока числа из коллекции делят нацело i, Если хотя бы одно число не поделило i возвращается c=False, прибавляем 10 к i и идем повторяем for с новым значением i и так пока все числа из коллекции не поделят i. Только тогда c=True по окончанию for и While завершится на первом таком значении, которое и будет наименьшим кратным.
Конечно алгоритм не претендует на оптимальность и есть место для разгона,может быть читатель предложит более оптимальное решение