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 reduz que receba inteiros a e b e devolva o racional que representa a / b ;

Passo 1

Resumo: a gente precisa criar uma função “reduz” que receba dois inteiros a e b (com b neq 0) e retorne um struct racional representando a/b já em forma reduzida, isto é, com gcd(p,q)=1 e q>0. Vamos usar o struct dado e o algoritmo de Euclides pra calcular o máximo divisor comum.

Passo 2

Entender o algoritmo de Euclides: para dois inteiros x e y, repetimos r = x bmod y, depois fazemos x=y e y=r até y=0. Então x é o gcd(x,y). Antes disso, usamos |a| e |b| pra lidar com negativos.
Após calcular d=gcd(|a|,|b|), simplificamos a fração dividindo numerador e denominador por d: definimos p = a/d e q = b/d. Assim garantimos gcd(p,q)=1.

Passo 3

Garantir denominar estritamente positivo: se q<0, multiplicamos ambos por -1, ou seja, fazemos p=-p e q=-q.

Passo 4

Por fim, construímos o struct racional com esses valores e retornamos. É só montar um struct com rp=p e rq=q e dar $return.

Resposta

#include <stdlib.h>
static int mdc(int x, int y) {
x = abs(x);
y = abs(y);
while (y != 0) {
int r = x % y;
x = y;
y = r;
}
return x;
}
struct racional reduz(int a, int b) {
int d = mdc(a, b);
int p = a / d;
int q = b / d;
if (q < 0) {
p = -p;
q = -q;
}
struct racional r;
r.p = p;
r.q = q;
return r;
}

Exercícios relacionados