1022 - TDA Racional

Nada que uma orientação a objeto não resolva.

Descrição

Solução

É possível montar uma classe para armazenar numerador, denominador e retornar operações com outras funções e sua forma irredutível dividindo o numero e o denominador pelo MDC de ambos.

Em algumas linguagens, é até possível sobrescrever os operadores de soma, subtração, multiplicação e divisão para um código mais natural, mas isso não é necessário.

Para fazer cada operação, siga as instruções presentes no enunciado.

#include <stdio.h>

struct Fracao
{
    int num, den;
};

struct Fracao soma(struct Fracao f1, struct Fracao f2)
{
    struct Fracao retorno;

    retorno.num = f1.num * f2.den + f2.num * f1.den;
    retorno.den = f1.den * f2.den;

    return retorno;
}

struct Fracao subtracao(struct Fracao f1, struct Fracao f2)
{
    struct Fracao retorno;

    retorno.num = f1.num * f2.den - f2.num * f1.den;
    retorno.den = f1.den * f2.den;

    return retorno;
}

struct Fracao multiplicacao(struct Fracao f1, struct Fracao f2)
{
    struct Fracao retorno;

    retorno.num = f1.num * f2.num;
    retorno.den = f1.den * f2.den;

    return retorno;
}

struct Fracao divisao(struct Fracao f1, struct Fracao f2)
{
    struct Fracao retorno;

    retorno.num = f1.num * f2.den;
    retorno.den = f2.num * f1.den;

    return retorno;
}

int MDC(int a, int b)
{
    return (b == 0) ? a : MDC(b, a % b);
}

struct Fracao irredutivel(struct Fracao f)
{
    int mdc = (f.num < 0) ? MDC(-f.num, f.den) : MDC(f.num, f.den);

    f.num /= mdc;
    f.den /= mdc;

    return f;
}

int main()
{
    int N;
    char operador;
    struct Fracao f1, f2, resultado;

    scanf("%d\n", &N);

    for (int i = 0; i < N; ++i)
    {
        scanf("%d / %d %c %d / %d\n", &f1.num, &f1.den, &operador, &f2.num, &f2.den);

        switch (operador)
        {
        case '+':
            resultado = soma(f1, f2);
            break;
        case '-':
            resultado = subtracao(f1, f2);
            break;
        case '*':
            resultado = multiplicacao(f1, f2);
            break;
        case '/':
            resultado = divisao(f1, f2);
            break;
        }

        printf("%d/%d = ", resultado.num, resultado.den);
        resultado = irredutivel(resultado);
        printf("%d/%d\n", resultado.num, resultado.den);
    }

    return 0;
}

Last updated