Herramientas de usuario

Herramientas del sitio


algoritmos-oia:enteros:fracciones

Cómo guardar información de una fracción

El método más conocido y fácil de imaginar es usando una struct, guardando el numerador y el denominador en dos variables enteras distintas. De esta manera evitamos trabajar con números decimales que pueden eventualmente traer errores de redondeo.

Algo interesante que podemos hacer con esta estructura es comparar las fracciones. En vez de comparar números con coma que podrían dar cosas distintas por redondeos cuando en realidad representan al mismo valor, vamos a compararlas así:

Veamos que si $n_1/d_1 < n_2/d_2 =\Rightarrow n_1*d_2 < n_2*d_1$, y lo mismo con la igualdad y con el “mayor”. Acá hay que tener cuidado porque estamos multiplicando dos números. Por más de que esos números entren en un “int”, no garantiza que el producto también. Por las dudas guardaremos los números en variables “long”.

Entonces podríamos tener una función que recibe dos fracciones y dice si la primera es menor o no:

fracciones.cpp
struct fraccion{
    long long int numerador, denominador;
};
 
bool esMenor(fraccion a, fraccion b){
    if(a.numerador*b.denominador < b.numerador*a.denominador){
        return true;
    }else{
        return false;
    }
}

Algo que es interesante al trabajar con fracciones, es que podemos convertirlas en irreducibles muy fácilmente, utilizando la función que nos da el máximo común divisor muy rápido, y dividiendo al numerador y al denominador por él.

También podemos calcular la diferencia entre dos fracciones $a/b$ y $c/d$ como $a/b - c/d = (a*d - c*b)/b*d$, y dejarlo expresado como una fracción.

Un problema donde el uso de la estructura “fraccion” nos puede facilitar el código es este. No suelen haber problemas donde sea necesario el uso de esta estructura, pero facilita mucho el código y disminuye errores.

algoritmos-oia/enteros/fracciones.txt · Última modificación: 2018/05/03 22:21 por sebach