Blogia
JAB

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 ;)

7 comentarios

Charlie -

Jo**r! A saber lo que se metió el ruso ese para inventar este método!! XD

TempWin -

Uff, si supieras la cantidad de lenguajes que tienes que manejar en el segundo curso de nuestra facultad...

Venga, Javier, a ver ese código en Brainfuck :-D

Javier Romero -

Espérate, que esto te lo hago yo en Brainfuck :->

Luther Blissett -

Sip, efectivamente es C, el unico lenguaje que nos enseñan en la carrera, que verguenza...

TempWin -

No sé que le pasa a los comentarios... Lo pondré en el post, entonces.

TempWin -

Poniendo el pseudocógido (para que cualquiera pueda codificarlo en su lenguaje favorito):

FUNCIÓN rusa(m, n)
resultado

Luther Blissett -

Acabo de rescatar esto de mis prácticas de algoritmia ;-P

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); }