Арнольд Шварценеггер стреляет в ужасного монстра Годзиллу из дробовика. Нужно найти общую величину урона, нанесённого Годзилле выстрелом.
Подсказка: возможно, для быстрой работы программы вам пригодится алгоритм Евклида.
Формат вводаСначала вводится количество дробинок.Затем урон от каждой дробинки. Урон от каждой дробинки выражается простой дробью, её числитель и знаменатель вводятся на отдельных строках.
Формат выводаСуммарный урон, выраженный простой несократимой дробью с дробной чертой между числителем и знаменателем.
напиши код на python
Арнольд Шварценеггер стреляет в ужасного монстра Годзиллу из дробовика. Нужно найти общую величину урона, нанесённого Годзилле выстрелом.
Подсказка: возможно, для быстрой работы программы вам пригодится алгоритм Евклида.
Формат ввода Сначала вводится количество дробинок. Затем урон от каждой дробинки. Урон от каждой дробинки выражается простой дробью, её числитель и знаменатель вводятся на отдельных строках.
Формат вывода Суммарный урон, выраженный простой несократимой дробью с дробной чертой между числителем и знаменателем.
Давайте разберемся, как решить эту задачу шаг за шагом.
1. **Понимание задачи**: Нам нужно суммировать урон от нескольких дробинок, где урон каждой дробинки задан в виде простой дроби. Итоговый урон также должен быть представлен в виде простой несократимой дроби.
2. **Ввод данных**: Сначала вводится количество дробинок, а затем для каждой дробинки вводится числитель и знаменатель её урона.
3. **Сложение дробей**: Для сложения дробей необходимо привести их к общему знаменателю. Общий знаменатель можно найти как наименьшее общее кратное (НОК) знаменателей.
4. **Упрощение дроби**: После сложения дробей, итоговую дробь нужно упростить, разделив числитель и знаменатель на их наибольший общий делитель (НОД).
5. **Алгоритм Евклида**: Этот алгоритм поможет нам находить НОД, что необходимо как для нахождения НОК, так и для упрощения итоговой дроби.
Теперь напишем код, который реализует описанные шаги:
```python
def gcd(a, b):
while b:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b)
def sum_fractions(fractions):
# Начальная сумма дробей
numerator_sum = 0
denominator_sum = 1
for numerator, denominator in fractions:
# Находим НОК текущего знаменателя и общего знаменателя
common_denominator = lcm(denominator_sum, denominator)
# Приводим числители к общему знаменателю
numerator_sum = (numerator_sum * (common_denominator // denominator_sum) +
numerator * (common_denominator // denominator))
# Обновляем общий знаменатель
denominator_sum = common_denominator
# Упрощаем итоговую дробь
common_divisor = gcd(numerator_sum, denominator_sum)
numerator_sum //= common_divisor
denominator_sum //= common_divisor
return numerator_sum, denominator_sum
# Ввод данных
n = int(input("Введите количество дробинок: "))
fractions = []
for _ in range(n):
numerator = int(input("Введите числитель дроби: "))
denominator = int(input("Введите знаменатель дроби: "))
fractions.append((numerator, denominator))
# Вычисляем суммарный урон
total_numerator, total_denominator = sum_fractions(fractions)
# Выводим результат
print(f"Суммарный урон: {total_numerator}/{total_denominator}")
```
**Пояснение к коду**:
- Функция `gcd` реализует алгоритм Евклида для нахождения наибольшего общего делителя.
- Функция `lcm` использует НОД для нахождения наименьшего общего кратного.
- Функция `sum_fractions` проходит по всем дробям, суммирует их, приводя к общему знаменателю, и упрощает итоговую дробь.
- Ввод данных осуществляется с помощью `input`, и результаты вычислений выводятся в виде несократимой дроби.