Um racional é qualquer número da forma p / q, sendo p inteiro e q inteiro não nulo. É conveniente representar um racional por um registro:
struct racional{
    int p, q;
};
Vamos convencionar que o campo q de todo racional é estritamente positivo e que o máximo divisor comum dos campos p e q é 1 . Escreva
uma função soma que receba racionais x e y e devolva o racional que representa a soma de x e y;

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 = p1/q1 e y = p2/q2, então
p1q1 + p2q2 = p1 q2 + p2 q1q1 q2

Passo 3

Depois de obter o numerador e denominador da soma, precisamos simplificar a fração dividindo ambos pelo gcd(|p|,q). O algoritmo de Euclides faz isso em tempo eficiente.

Passo 4

Finalmente, garantimos que o denominador resultante seja positivo. Se q<0, basta multiplicar numerador e denominador por -1.

Passo 5

Com esses passos em mente, implementamos em C: criamos uma função auxiliar gcd, 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;
// 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;
}
// 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;
// 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;
}

Exercícios relacionados