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

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= p1/q1 e y= p2/q2, temos
xy=p1/q1p2/q2=p1cdot q2q1cdot p2
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.

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.

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;
}

Exercícios relacionados