@timkin1

Как реализовать сумму дробей?

Подскажите, пожалуйста, как реализовать программу для подсчета суммы дробей без использования массивов. Программе на вход подается число (от 1 до 5), которое равно количеству пар чисел x и y. А на выходе необходимо вывести сумму дробей вида x1/y1+x2/y2+..+Xn/Yn.

Прошу помочь придумать алгоритм.
  • Вопрос задан
  • 1185 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А что там придумывать? Сложение - первый класс начальной школы, операции с дробями - пятый класс.
Просто последовательно складывайте дроби в натуральном представлении.
Ответ написан
arusef
@arusef
Novice .NET dev
Общая схема примерно такая:
(I)nput := [x0, y0, x1, y1, x2, y2 ... xn, yn]

(R)ational := (a, b)
Trunc(R) := R(a / НОД(a,b), b / НОД(a,b))
R1 + R2 := Trunc(a1*b2 + a2*b1, b1*b2)
R1 + R2 + R3 := (R1 + R2) + R3

Output := R(I[0],I[1]) + R(I[2],I[3]) + ... + R(I[2n-1],I[2n])
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Заводим структуру-сумматор. Изначально она 0/1. Что-то типа
typedef struct {
  int num, den;
} Fraction;

…

Fraction sum = { 0, 1 };

Дальше пишу псевдокодом, НОД и НОК разберись, как реализовать самому.
для каждой очередной дроби
  ввести(дробь)
  новыйЗнам = НОК(сумматор.знам, дробь.знам)
  множСумм = новыйЗнам / сумматор.знам
  множДробь = новыйЗнам / дробь.знам
  новыйЧисл = сумматор.числ × множСумм + дробь.числ × множДробь
  сокрНод = НОД(новыйЧисл, новыйЗнам)
  сумматор.числ = новыйЧисл/сокрНод
  сумматор.знам = новыйЗнам/сокрНод

Можно и оптимизировать, но тогда нужна хитрая разновидность алгоритма Евклида; в учебных целях не стоит.

И ещё. Одна из известных ошибок в написании НОК — произведение аргументов не влезает в свой тип, а НОК влезает. Поймёшь, как в такой ситуёвине избавиться от переполнения?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы