Escriba el algoritmo de multiplicación más rápido (mejor big-O) y más pequeño para enteros positivos, sin usar operadores de multiplicación. Solo se permiten sumas, restas, funciones lógicas (AND, OR, XOR, NOT), desplazamiento de bits, rotación de bits, giro / ajuste / limpieza de bits y prueba de bits. Su programa debe ser capaz de multiplicar números de 16 bits para producir un resultado de 32 bits. Tome la entrada en stdin, separada por comas, espacios o nuevas líneas (su elección), pero deje en claro cómo ingresar los datos.
Ejemplo de entrada / salida:
734 929
681886
code-golf
math
restricted-source
Thomas O
fuente
fuente
Respuestas:
C,
848378 caracteresEn una forma más legible
El algoritmo se conoce mejor como Multiplicación etíope o Multiplicación campesina rusa. Aquí está el algoritmo:
fuente
m=0
(al menos para mí)for(;(a&1&&m+=b)|a;a>>=1,b<<=1);
Sí, estoy muy avergonzado. :)for(m=0;(a&1&&m+=b)|a;a/=2,b*=2);
por qué usar shift, ¿verdad?b+=b
lugar deb*=2
. Por supuesto, aún necesitará el cambio correcto.APL (5)
Toma entrada en entrada estándar separada por nuevas líneas.
fuente
Golfscript - 12 caracteres
Tenga en cuenta que
*
aquí no está el operador de multiplicación, en cambio es un operador de repetición, vea el segundo uso aquí .fuente
Golfscript - 27 caracteres
La multiplicación de los campesinos. Hay primero * allí es una multiplicación, pero sólo por 0 o 1
Aquí hay 31 caracteres que no se multiplican en absoluto
fuente
Python, 64 caracteres
Sin embargo, probablemente no sea el más eficiente (o el más compatible, pero estoy "agregando", ¿no?):
fuente
input()
en lugar deint(raw_input())
guardar 18 caracteres. Puede considerar esta trampa, peroprint sum([input()]*input())
también funciona (*
se usa para la repetición, no para la multiplicación).r=input;a=r();print sum(map(lambda x:a,range(r())))
es mucho más cortor=input;a=r();r(sum(a for b in range(r())))
es aún más corto (43 frente a 51 bytes)Rubí, 30
Basado en la respuesta GigaWat .
fuente
Golfscript - 43
Implementación de la multiplicación campesina . Creo que más adelante podré jugar al golf.
fuente
J,
1817 caracteresLa entrada debe estar separada por espacios.
fuente
Python, también 64 caracteres
fuente
i=input
y usandoi()
0 if n==0 else
conn and
VBA, 70 caracteres
En realidad, esto es bastante lento para grandes cantidades, pero es pequeño.Logré mejorar el tamaño del código mientras mejoraba la velocidad. El tiempo de cálculo varía, dependiendo de la posición del argumento, no solo del tamaño. (es decir, 1000, 5000 calcula en aproximadamente 4 segundos, mientras que 5000, 1000 calcula en aproximadamente 19) Dado que el OP enumera tanto rápido como pequeño, pensé que iría con este. La entrada es dos argumentos numéricos, separados por comas.Esta versión más larga ( 103 caracteres ) asegurará que se ejecute con el más rápido de los dos arreglos posibles:
fuente
To
y en la concatenación, así como por outputiing a la ventana inmediata a través de VBEDebug.?
Perl: 52 caracteres
Esta es una vieja pregunta, pero Perl necesita ser representado:
(Este es el algoritmo binario; la suma iterada es más pequeña pero mucho demasiado aburrido.)
Este programa incluye una característica no intencional: si su línea de entrada contiene un tercer número, el programa realmente calculará A * B + C.
fuente
Una variación en Scala, optimizada para el tamaño: 48 caracteres
optimizado para la velocidad un poco:
Cambio (a, b) if (a> b), para llegar al final más rápido. La diferencia es de 11 a 20 pasos, cuando se llama a mul (1023,31), en comparación con omitir esa línea de código.
Golfizado: 95 caracteres:
fuente
K,
1816.
fuente
Ruby, 35 caracteres
p $*.map!(&:to_i).pop*$*.inject(:+)
Es un programa que toma entradas y salidas, no solo una función.
fuente
Ruby, 35 bytes
Uso:
x([123, 456]) #=> 56088
Probablemente podría acortarse si los números se leen desde ARGV, pero se queja de que tienen el formato incorrecto (cadenas, no ints). Cualquier sugerencia seria genial.
fuente
Mathematica 12
Los siguientes
#2
casos de sumas de#1
.Código
Uso
9 caracteres?
Si los parámetros del programa,
a
,b
, se pueden utilizar para la entrada, el mismo resultado se puede lograr con 9 caracteres .fuente
VB11, 101 caracteres
fuente
==
) no están permitidas por la pregunta, pero muchas respuestas las están usando.