К основному контенту

Задача №5 Наименьшее кратное

Условие задачи


2520 - самое маленькое число, которое делится без остатка на все числа от 1 до 10.
Какое самое маленькое число делится нацело на все числа от 1 до 20?

Скажу сразу - не смотря на не большой диапазон чисел условия реализация этой задачи получилась громоздкой и ее выполнение занимает больше всего времени - около 90 с  несмотря на все попытки оптимизации.

Решение 
Для решения будем также использовать метод перебора, но стартовать будем с числа 2520 т.к меньшим кратное от 1 до 20-ти быть не может

Используемые мной параметры
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 завершится на первом таком значении, которое и будет наименьшим кратным.

Конечно алгоритм не претендует на оптимальность и есть место для разгона,может быть читатель предложит более оптимальное решение

Популярные сообщения из этого блога

Задача №1 Сумма чисел, кратных 3 м и 5-ти

 . Задача №1 Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел - 23. Найдите сумму всех чисел меньше 1000, кратных 3 или 5. Решение

Задача 21. Дружественные числа

Пусть d( n ) определяется как сумма делителей  n  (числа меньше  n , делящие  n  нацело). Если d( a ) =  b  и d( b ) =  a , где  a  ≠  b , то  a  и  b  называются дружественной парой, а каждое из чисел  a  и  b  - дружественным числом. Например, делителями числа 220 являются 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, поэтому d(220) = 284. Делители 284 - 1, 2, 4, 71, 142, поэтому d(284) = 220. Подсчитайте сумму всех дружественных чисел меньше 10000. Решение Для начала определим функцию, которая будет возвращать сумму делителей числа: def get_sum(n):     s=0     for i in range(1,n):         if n%i==0:             s+=i     return s Думаю не требует объяснений все довольно тривиально Далее определяем функцию, возвращающую список дружественных чисел до числа n:   def gen_friendlys(n):   ...

Задача 14.Самая длинная последовательность Коллатца

Условие: Следующая повторяющаяся последовательность определена для множества натуральных чисел: n  →  n /2 ( n  - чётное) n  → 3 n  + 1 ( n  - нечётное) Используя описанное выше правило и начиная с 13, сгенерируется следующая последовательность: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 Получившаяся последовательность (начиная с 13 и заканчивая 1) содержит 10 элементов. Хотя это до сих пор и не доказано (проблема Коллатца (Collatz)), предполагается, что все сгенерированные таким образом последовательности оканчиваются 1. Какой начальный элемент меньше миллиона генерирует самую длинную последовательность? Решение Гипотеза Коллатца сводится к тому что данная последовательность всегда оканчивается единицей. Если верить Википедии, то она не доказана и над проверкой гипотезы на больших числах сейчас трудятся миллионы видеокарт добровольцев вычислительной сети BOINC в рамках проекта Collatz Conjecture. Мы же будем работать с не очень больши...