Задача: 2520 -- это самое маленькое число, которое можно разделить на каждое из чисел от 1 до 10 без остатка. Какое самое маленькое число, которое можно разделить без остатка на все числа от 1 до 14? Напишите функцию, которая выводит это число.
Я понимаю, что решение нужно осуществлять через цикл внутри функции, но не понимаю, как это должно выглядеть
Python
Задача питон. Помогите решить,пожалуйста
Мне кажется, стоит посмотреть в сторону алгоритмов нахождения НОК нескольких чисел.
Решение "в лоб", которое приходит в голову, это
В Питоне (начиная с 3.9, кажется), есть функция
Если в вашей версии Питона этой функции нет, то воспользуемся равенством:
Например, НОК чисел от 1 до 10 можно посчитать так:
reduce выполняет свёртку списка в одно значение, полученное последовательным применением переданной функции к первому и втором элементу, потом к результату и третьему элементу, и так до конца. В нашем случае функция делит произведение чисел на их НОД, получая в результате НОК.
НОК чисел от 1 до 14 - это замена верхней границы диапазона в приведённой выше программе:
Или слегка оптимизированный вариант, учитывая что из условия задачи мы знаем НОК(1, ..., 10) = 2520:
Решение "в лоб", которое приходит в голову, это
НОК(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, чтоб было понятно, от чего считали НОК.Вот как будет с функцией. Первый способ (быстрый):
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
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
Вот решение брутфорсомПохожие вопросы
- Задача питон помогите срочно
- Решить две задачи на питоне. Помогите пожалуйста
- Помогите решить задачу на питоне. пожалуйста.
- Помогите мне пожалуйста решить задачу на питоне!
- Помогите решить задачу в питоне, пожалуйста.
- Помогите решить задачу на питон!!
- ПОЖАЛУЙСТА, ПОМОГИТЕ, С ЭТОЙ ЗАДАЧЕЙ. ПИТОН.
- Питон. Нужно помочь решить задачу с циклом for
- Помогите решить задачу на Питоне
- Помогите решить задачу в питоне