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 soma que receba racionais
e y e devolva o racional que representa a soma de x e y;
struct racional{
int p, q;
};
uma função soma que receba racionais
Passo 1
O enunciado pede uma função em C que receba dois racionais x e y (cada um com numerador p e denominador q) e devolva a soma desses números, respeitando as convenções de denominador estritamente positivo e fração irredutível. Vamos usar conceitos de soma de frações, máximo divisor comum (MDC) e tratamento de sinal do denominador.
Passo 2
Para somar duas frações usamos a fórmula clássica de soma de racionais. Se x =
e y =
, então
Passo 3
Depois de obter o numerador e denominador da soma, precisamos simplificar a fração dividindo ambos pelo
. O algoritmo de Euclides faz isso em tempo eficiente.
Passo 4
Finalmente, garantimos que o denominador resultante seja positivo. Se
, basta multiplicar numerador e denominador por
.
Passo 5
Com esses passos em mente, implementamos em C: criamos uma função auxiliar
, calculamos o numerador e denominador não simplificados, aplicamos a simplificação e ajustamos o sinal do denominador antes de retornar o resultado.
Resposta
#include <stdlib.h> // para abs
// definição do racional
typedef struct racional {
int p, q;
} racional;
typedef struct racional {
int p, q;
} racional;
// Euclides: calcula o máximo divisor comum de a e b (ambos não negativos)
static int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
static int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
// soma de dois racionais x e y
racional soma(racional x, racional y) {
racional r;
// soma de frações
r.p = x.p * y.q + y.p * x.q;
r.q = x.q * y.q;
racional soma(racional x, racional y) {
racional r;
// soma de frações
r.p = x.p * y.q + y.p * x.q;
r.q = x.q * y.q;
// simplifica usando o máximo divisor comum
int d = gcd(abs(r.p), r.q);
r.p /= d;
r.q /= d;
// garante que o denominador seja positivo
if (r.q < 0) {
r.p = -r.p;
r.q = -r.q;
}
return r;
}