Processing math: 100%

Solução Soma de Frações

Código de Roger Benet, comentários de Rogério Júnior

A primeira coisa a fazermos é calcular o valor de ab+cd. Para colocarmos toda a equação em uma mesma base, multiplicaremos o numerador e o denominador da primeira fração pela base da segunda, d, e faremos o mesmo na segunda, com a base da primeira, b. Agora, o valor que queremos calcular é:

adbd+bcbd = ad+bcbd

Apesar de termos encontrado uma fração que tem o valor da responta, não podemos imprimir os valores de seu numerador e denominador pois ela pode não estar em sua forma irredutível. Para que cheguemos nessa forma, precisamos eliminar todos os divisores comuns entre numerador e denominador, e fazemos isso dividindo ambos os números pelo MDC entre eles.

O cálculo do MDC entre dois números é uma tarefa simples que todo programador deve conhecer: o Algoritmo de Euclides. Vamos declarar a função int gcd(int x, int y) que calcula o valor de MDC(x,y). Para garantirmos que y é o maior número, trocaremos os valores de e y (podemos usar o swap) se y<x. Se for múltiplo de x, então MDC(x,y)=y, logo, retornamos y. Caso contrário, MDC(x,y) será o MDC entre x e o resto que y deixa na divisão por ("return gcd(x, y%x);").

Segue a adaptação do código do nosso leitor Roger Benet como solução ao problema proposto:

#include <cstdio> // scanf e printf
#include <algorithm> // swap
using namespace std; // para uso do C++
// declaro as variávei que vou usar
// num é o numerador da fração
// den é o denominador da fração
int num, den, a, b, c, d, k;
// função que calcula MDC(x,y)
int gcd(int y, int x){
// se y<x, troco os valores de x e y
if(y < x)swap(x,y);
// se y for múltiplo de x, MDC(x,y) = y
if(y % x == 0) return x;
// caso contrário, MDC(x,y) = MDC(x, y%x)
return gcd(x,y%x);
}
int main(){
// leio os valores de a, b, c, d
scanf("%d %d %d %d", &a, &b, &c, &d);
// o denominador começará como b*d
den = b*d;
// e o numerador como a*d + b*c
num = a*d + b*c;
// calculo o MDC entre numerador e denominador
k = gcd(num,den);
// e imprimo os valores de num e den divididos pelo MDC
printf("%d %d\n", num/k, den/k);
return 0;
}
view raw soma.cpp hosted with ❤ by GitHub