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 mult que receba racionais x e y e devolva o racional que representa o produto de x por y;

Passo 1

O enunciado pede uma função mult que receba dois racionais x e y (cada um com numerador p e denominador q>0 e coprimos) e devolva o produto também com q>0 e em forma reduzida. É conteúdo de multiplicação de números racionais e simplificação por máximo divisor comum (MDC). Vamos multiplicar numeradores e denominadores, depois simplificar.

Passo 2

Para multiplicar racionais, usamos a regra: dado x = p₁/q₁ e y = p₂/q₂, o produto r = x·y tem:
p = p1 cdot p2, q = q1 cdot q2
Como q₁>0 e q₂>0, então q>0 automaticamente, mantendo nossa convenção.

Passo 3

Para simplificar a fração resultante, aplicamos o algoritmo de Euclides para obter o MDC entre |p| e q. Ele funciona assim: dados a e b>0, enquanto b≠0 fazemos t=b, b=a mod b, a=t; ao fim, a é o MDC.
Depois de calcular g = gcd(|p|, q), dividimos numerador e denominador por g para que fiquem coprimos e garantimos que q continue positivo.

Resposta

#include <stdlib.h> // para abs
// função que retorna o máximo divisor comum de a e b (b≥0)
int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
struct racional mult(struct racional x, struct racional y) {
struct racional r;
// passo 1: multiplicar numeradores e denominadores
r.p = x.p * y.p;
r.q = x.q * y.q;
// passo 2: simplificar pelo MDC
int g = gcd(abs(r.p), r.q);
r.p /= g;
r.q /= g;

// r.q já é > 0, então convenção mantida
return r;
}

Exercícios relacionados