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 x e y (podemos usar o swap) se y<x. Se y 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 x ("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; | |
} |