Um racional é qualquer número da forma
, sendo
inteiro e
inteiro não nulo. É conveniente representar um racional por um registro:
struct racional{
int p, q;
};
Vamos convencionar que o campo
de todo racional é estritamente positivo e que o máximo divisor comum dos campos
e
é 1 . Escreva
uma função div que receba racionais
e y e devolva o racional que representa o quociente de x por y;
struct racional{
int p, q;
};
uma função div que receba racionais
Passo 1
O enunciado pede uma função em C que receba dois racionais x e y (cada um guardado num struct com campos inteiros p e q), e devolva o rácio x/y, obedecendo à convenção de q>0 e gcd(p,q)=1.
Passo 2
Para dividir duas frações, aplicamos a regra clássica: dado x=
e y=
, temos
Em seguida precisamos simplificar esse resultado e garantir que o denominador seja positivo.
Passo 3
Na implementação, primeiro calculamos numerador e denominador provisórios:
– numerador = x.p * y.q
– denominador = x.q * y.p
Se o denominador ficar negativo, invertemos o sinal de numerador e denominador para manter q>0.
– numerador = x.p * y.q
– denominador = x.q * y.p
Se o denominador ficar negativo, invertemos o sinal de numerador e denominador para manter q>0.
Passo 4
Por fim, usamos o algoritmo de Euclides para calcular gcd(|numerador|, denominador) e dividir ambos por esse valor, garantindo gcd(p,q)=1.
Também implementamos uma função auxiliar gcd(a,b) que retorna o máximo divisor comum usando o método repetido de resto.
Também implementamos uma função auxiliar gcd(a,b) que retorna o máximo divisor comum usando o método repetido de resto.
Resposta
#include <stdlib.h>
struct racional {
int p;
int q;
};
// Função que calcula o máximo divisor comum de a e b
static int gcd(int a, int b) {
a = abs(a);
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
// Função que retorna o racional x / y
struct racional div_racional(struct racional x, struct racional y) {
struct racional r;
// passo 1: calcula o quociente sem simplificar
r.p = x.p * y.q;
r.q = x.q * y.p;
// passo 2: ajusta o sinal para manter denominador positivo
if (r.q < 0) {
r.p = -r.p;
r.q = -r.q;
}
// passo 3: simplifica pelo gcd
int g = gcd(r.p, r.q);
r.p /= g;
r.q /= g;
return r;
}