Faça uma função chamada ‘simplifica’ que recebe como parâmetro o numerador e o denominador de uma fração. Esta função deve simplificar a fração recebida dividindo o numerador e o denominador pelo maior fator possível. Por exemplo, a fração 36/60 simplifica para
dividindo o numerador e o denominador por 12. A função deve modificar as variáveis passadas como parâmetro.
Passo 1
O enunciado pede uma função chamada simplifica que receba o numerador e o denominador de uma fração via referência e os reduza dividindo ambos pelo maior divisor comum (MDC). Vamos precisar usar o algoritmo de Euclides para calcular o MDC e, em seguida, alterar os valores originais dividindo-os por esse divisor.
Passo 2
Primeiro, implementamos uma função auxiliar mdc que calcula o maior divisor comum de dois inteiros usando o algoritmo de Euclides de forma iterativa. Também normalizamos os valores para negativos usando
por segurança.
Passo 3
Depois de obter o
, basta dividir os valores apontados por *num e *den por divisor. Para manter o sinal padrão (denominador positivo), podemos inverter sinal de ambos se o denominador simplificado ficar negativo.
Resposta
#include <stdlib.h>
int mdc(int a, int b) {
a = abs(a);
b = abs(b);
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
a = abs(a);
b = abs(b);
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
void simplifica(int *num, int *den) {
if (*den == 0) {
// Fração inválida, denominador zero
return;
}
int divisor = mdc(*num, *den);
*num /= divisor;
*den /= divisor;
// Garante denominador positivo
if (*den < 0) {
*num = -(*num);
*den = -(*den);
}
}
if (*den == 0) {
// Fração inválida, denominador zero
return;
}
int divisor = mdc(*num, *den);
*num /= divisor;
*den /= divisor;
// Garante denominador positivo
if (*den < 0) {
*num = -(*num);
*den = -(*den);
}
}