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 reduz que receba inteiros a e b e devolva o racional que representa
struct racional{
int p, q;
};
uma função reduz que receba inteiros a e b e devolva o racional que representa
Passo 1
Resumo: a gente precisa criar uma função “reduz” que receba dois inteiros
e
(com
) e retorne um struct
representando
já em forma reduzida, isto é, com
e
. 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
e
, repetimos
, depois fazemos
e
até
. Então
é o
. Antes disso, usamos
e
pra lidar com negativos.
Após calcular , simplificamos a fração dividindo numerador e denominador por
: definimos
e
. Assim garantimos
.
Após calcular
Passo 3
Garantir denominar estritamente positivo: se
, multiplicamos ambos por
, ou seja, fazemos
e
.
Passo 4
Por fim, construímos o struct racional com esses valores e retornamos. É só montar um
com
e
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;
}
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;
}
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;
}