Python

Задача питон. Помогите решить,пожалуйста

Задача: 2520 -- это самое маленькое число, которое можно разделить на каждое из чисел от 1 до 10 без остатка. Какое самое маленькое число, которое можно разделить без остатка на все числа от 1 до 14? Напишите функцию, которая выводит это число.

Я понимаю, что решение нужно осуществлять через цикл внутри функции, но не понимаю, как это должно выглядеть
VC
Vitali Chekan
107
Мне кажется, стоит посмотреть в сторону алгоритмов нахождения НОК нескольких чисел.
Решение "в лоб", которое приходит в голову, это
 НОК(a, b, c) = НОК(НОК(a, b), c) 
Т.е. последовательно находим НОК 2520 со следующим числом, результат - со следующим и т.п.

В Питоне (начиная с 3.9, кажется), есть функция
 math.lcm(*integers) 
Можно в неё сразу список передать. Список формируется так:
 nums = [i for i in range(1, 11)] 
(создаёт список из 10 элементов от 1 до 10 включительно; в range передаётся исключающая граница 11)

Если в вашей версии Питона этой функции нет, то воспользуемся равенством:
 НОК(a; b) = a ∙ b / НОД(a; b) 
НОД в Питоне вычисляется функцией
 math.gcd(a, b) 
Она уже не настолько удобна, принимает только два целых параметра. Поэтому дальше придётся итерироваться в каком-то виде.

Например, НОК чисел от 1 до 10 можно посчитать так:
 import math, functools

nums = [i for i in range(1, 11)]
lcm = functools.reduce(lambda a, b: a * b // math.gcd(a, b), nums)
print("LCM", nums, " = ", lcm, sep = "")
Выводит:
 LCM[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] = 2520 

reduce выполняет свёртку списка в одно значение, полученное последовательным применением переданной функции к первому и втором элементу, потом к результату и третьему элементу, и так до конца. В нашем случае функция делит произведение чисел на их НОД, получая в результате НОК.

НОК чисел от 1 до 14 - это замена верхней границы диапазона в приведённой выше программе:
 import math, functools

nums = [i for i in range(1, 15)]
lcm = functools.reduce(lambda a, b: a * b // math.gcd(a, b), nums)
print("LCM", nums, " = ", lcm, sep = "")
Вывод:
 LCM[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] = 360360 

Или слегка оптимизированный вариант, учитывая что из условия задачи мы знаем НОК(1, ..., 10) = 2520:
 import math, functools

nums = [i for i in range(10, 15)]
lcm = functools.reduce(lambda a, b: a * b // math.gcd(a, b), nums, 2520)
print("LCM", [2520] + nums, " = ", lcm, sep = "")
Вывод:
 LCM[2520, 10, 11, 12, 13, 14] = 360360 
Здесь мы формируем список от 11 до 14 и передаём в reduce третий параметр - начальное значение аккумулятора, т.е. 2520. Сначала будет вычислен НОК(2520; 11), затем НОК результата с 12-ю, и так до 14 включительно. Для вывода на экран спереди к списку дописывается 2520, чтоб было понятно, от чего считали НОК.
Антон Филимонов
Антон Филимонов
54 053
Лучший ответ
Вот как будет с функцией. Первый способ (быстрый):
 from math import lcm 
def f():
p = 1
for i in range(2, 15):
p = lcm(p, i)
return p
print(f())
Второй способ (медленный):
 def f(): 
for i in range(1, 1000000):
yes = True
for j in range(2, 15):
if i % j:
yes = False; break
if yes:
print(i); break
f()
Результат работы обеих программ одинаковый: 360360
Aleksey. K
Aleksey. K
66 572
Andrey Sk LCM довольно поздно появился. На gdb online, например, его нет. И цикклы тут не нужны от слова совсем. :-)
 a = 2520 
while True:
for i in range(2,15):
d = a//i
if d*i != a:
break
else:
print(a)
break

a+=1
Вот решение брутфорсом