domingo, 25 de octubre de 2015

Operación Residuo (MOD)

El set de instrucciones de cada lenguaje de programación puede llegar a ser tan amplio que no llegamos a aprenderlo todo y mucho menos saber en qué casos podemos sacar ventaja de utilizar una instrucción determinada.
En este post quiero hablar de la instrucción de Residuo, conocida como % en C, C++, php, java o MOD en COBOL, PLSQL, Pascal.

Recordando un poco de matemáticas, sabemos que:
Dividendo = Cociente * Divisor + Residuo
Ejm. 7 = 3 * 2 + 1
Si despejamos el residuo sería:
Residuo = Dividendo - (Cociente * Divisor)

La operación Residuo se calcula utilizando el Dividendo y el cociente o el dividendo y el divisor. La sintaxis sería:
Residuo = Dividendo % Cociente (1 = 7 % 3)
Residuo = Dividendo % Divisor (1 = 7 % 2)

¿En qué casos podemos utilizar esta operación?
Sólo os daré dos casos típicos:

Realizar una acción cuando un número es múltiplo de otro
Imprimir los 30 primeros múltiplos de 3
int numerosImpresos = 0 //controla el número de números impresos
int contador = 1; //Es el número que hace de Dividendo en la operación
while(numerosImpresos < 30)
{
  if (contador % 3 == 0) //si el residuo es 0, es una división exacta por tanto es múltiplo
  {
    Console.write(contador);  
  }
  contador ++;
}

Realizar un cambio de base
Cambiar el número 5 de base decimal a binario.
Como se cambia a sistema binario de utiliza el divisor = 2 (Base N, implica divisor N)

int dividendo = 5;
int divisor = 2;
string cambioBase = “”;

while(dividendo / divisor >1)
{
  residuo = dividendo % divisor;
  dividendo = dividendo / divisor;
  cambioBase = residuo + cambioBase; //se va concatenando a la izquierda
}
cambioBase = dividendo + cambioBase; //en esta variable está el resultado "101"



¿Se os ocurre otro ejemplo?






2 comentarios:

  1. Gracias por el artículo, esta bueno.

    Quisiera agregar que hay una interesante discusión acerca de cómo debe trabar este operador con los valores negativos, ya que el resultado varia desacuerdo a como se defina el residuo para los números negativos. Por ejemplo si abres la calculadora científica de Windows y calculas -360 MOD 60 este retorna -40 pero si realizas la misma operación en Excel mod(-340,60) este retorna 20

    Encontraras la misma diferencia en Java y Python, y te preguntaras cual el correcto resultado, y la respuesta para variar es “depende”, depende de cómo definas el residuo.

    Si se define el residuo como la cantidad por el cual el número excede el mayor entero múltiplo del divisor que no es mayor que el número y aplicamos esto a nuestro caso tendremos:
    -340 está entre -360 y -300 por lo cual -360 es el mayor múltiplo menor a -340 entonces tendremos que substraer -360 de -340 y esto retorna 20

    Si aplicas la misma definición para los números positivos tendremos:
    340 está entre 300 y 360 por lo cual -300 es el mayor múltiplo menor a 340 entonces tendremos que substraer 300 de 340 y esto retorna 40

    Interesante verdad?

    R

    ResponderEliminar
  2. Hola!!

    Si que es cierto que el tratamiento con números negativos varía. El objetivo del post se basa en la división euclidea de números naturales, cuando empiezas a tratar con negativos, depende del principio en que te bases la respuesta será una u otra o varias.

    Dejo un enlace para revisar el teorema de euclídes para números enteros, con este se puede cubrir algunos de los casos que comentas, sin embargo hice la prueba en C y no lo cumple.
    https://es.wikipedia.org/wiki/Divisi%C3%B3n_eucl%C3%ADdea

    En conclusión, como un objetivo académico puro y duro lo dejaría en el universo de los números naturales y para los que quieren ir más allá como tu, buscar teoremas para el cálculo del residuo y contrastarlo con el lenguaje que estén utilizando.

    Gracias por el comentario :)

    ResponderEliminar