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

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

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

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

Задача №3 Наибольший простой делитель

Условие задачи Простые делители числа 13195 - это 5, 7, 13 и 29. Каков самый большой делитель числа 600851475143, являющийся простым числом? Решение Простым числом, является натуральное число больше единицы, которое имеет 2 делителя - 1 и само себя.  Для начала найдем все простые делители необходимого числа.  Чтобы сократить поиск будем перебирать до квадратного корня  600851475143 округленного вверх  ( функцией  math.ceil) Перебор будем вести начиная с числа 3. Если i делит число на цело, рекурсивно обращаемся к функции issimple c аргументом i. Функция issimple возвращает пустой список если число является простым. В этом случае число попадает в результирующий список Далее остается только вернуть максимальное значение массива простых чисел, которые нацело делят число 600851475143  Код Python import math def issimple(a): r=math.ceil(math.sqrt(a)) lst=[] for i in range(3,r): if a%i==0: if issimple(i)==[]: lst.app

Задача №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):     res=[]     for i in range(1,n):         if i not in res:             tmp=get_sum(i)             if i==get_sum(tmp) and i!=tmp:                 res.append(i)                 res.