Aprendiendo a multiplicar
Un ejercicio: multiplica 12345 por 321 usando tan solo lápiz y papel.
Seguramente lo que hagas será esto:
Vamos multiplicando cada número del multiplicador por todo el multiplicando y colocándolo en un nivel inferior. Así nos enseñan en la escuela. Pero vamos a ver otro método. La multiplicación a la rusa (à la russe). Vamos a hacer dos columnas, una con el multiplicador y otra con el multiplicando. En la del multiplicador van a ir los números que se obtienen al hacer la división entera. Por ejemplo, el primero número será 160 porque 321 / 2 = 160 (ojo, nos quedamos con la parte entera, obviamos los decimales) y así vamos haciendo hasta llegar al 1. En la columna del multiplicando hacemos al revés. Vamos multiplicando por dos (o sumando cada número consigo mismo). Así, el siguiente número a 12345 será 24690. Y hacemos esto hasta llegar al nivel del 1 del multiplicador. Ahora nos quedamos con aquellos números del multiplicando que correspondan con valores impares del multiplicador y los sumamos y he ahí el resultado. Parece un lío así dicho, así que veámoslo gráficamente:
Seguramente sigas usando el método que nos enseñan en clase, pero no deja de ser curioso. Además, no nos ha hecho falta saber la tabla de multiplicar para usar este método, tan solo saber dividir un número entre dos y sumar. Muy parecido a la forma que tienen los computadores de realizar las multiplicaciones :)
:: Actualización
Luther Blissett, en los comentarios, muestra el código en C (o alguna variante del C, corrígeme si me equivoco) para resolver este problema. Así que, para los que queráis implementar este método en vuestro lenguaje de programación favorito, os escribo el pseudocógido:
FUNCIÓN rusa(m, n)
___ resultado < -- 0
___ REPETIR
_____ SI m es impar ENTONCES resultado < -- resultado + n
_____ m < -- m / 2
_____ n < -- n + m
___ HASTA QUE m = 1
___ DEVOLVER resultado
Donde m = multiplicador y n = multiplicando ;)
Seguramente lo que hagas será esto:
Vamos multiplicando cada número del multiplicador por todo el multiplicando y colocándolo en un nivel inferior. Así nos enseñan en la escuela. Pero vamos a ver otro método. La multiplicación a la rusa (à la russe). Vamos a hacer dos columnas, una con el multiplicador y otra con el multiplicando. En la del multiplicador van a ir los números que se obtienen al hacer la división entera. Por ejemplo, el primero número será 160 porque 321 / 2 = 160 (ojo, nos quedamos con la parte entera, obviamos los decimales) y así vamos haciendo hasta llegar al 1. En la columna del multiplicando hacemos al revés. Vamos multiplicando por dos (o sumando cada número consigo mismo). Así, el siguiente número a 12345 será 24690. Y hacemos esto hasta llegar al nivel del 1 del multiplicador. Ahora nos quedamos con aquellos números del multiplicando que correspondan con valores impares del multiplicador y los sumamos y he ahí el resultado. Parece un lío así dicho, así que veámoslo gráficamente:
Seguramente sigas usando el método que nos enseñan en clase, pero no deja de ser curioso. Además, no nos ha hecho falta saber la tabla de multiplicar para usar este método, tan solo saber dividir un número entre dos y sumar. Muy parecido a la forma que tienen los computadores de realizar las multiplicaciones :)
:: Actualización
Luther Blissett, en los comentarios, muestra el código en C (o alguna variante del C, corrígeme si me equivoco) para resolver este problema. Así que, para los que queráis implementar este método en vuestro lenguaje de programación favorito, os escribo el pseudocógido:
FUNCIÓN rusa(m, n)
___ resultado < -- 0
___ REPETIR
_____ SI m es impar ENTONCES resultado < -- resultado + n
_____ m < -- m / 2
_____ n < -- n + m
___ HASTA QUE m = 1
___ DEVOLVER resultado
Donde m = multiplicador y n = multiplicando ;)
7 comentarios
Charlie -
TempWin -
Venga, Javier, a ver ese código en Brainfuck :-D
Javier Romero -
Luther Blissett -
TempWin -
TempWin -
FUNCIÓN rusa(m, n)
resultado
Luther Blissett -
unsigned long multiplicacion_rusa(unsigned long mayor, unsigned long menor){
unsigned long resultado=0, temp=0;
if (mayor < menor){
temp=mayor;
mayor=menor;
menor=temp;
} /* Hace que el valor almacendo en mayor, sea efectivamente el mayor de los dos operandos */
while (menor!=0){
if ( menor % 2 == 1)
resultado += mayor;
printf ("%20lu %20lu %20lun", menor, mayor, ((menor%2) ? mayor : 0ul) );
menor /= 2;
mayor += mayor;
}
return (resultado); }