Escreva o algoritmo de multiplicação mais rápido (melhor big-O) e menor para números inteiros positivos, sem usar operadores de multiplicação. Só é permitida a adição, subtração, funções lógicas (AND, OR, XOR, NOT), mudança de bits, rotação de bits, rotação / definição / limpeza de bits e teste de bits. Seu programa deve ser capaz de multiplicar números de 16 bits para produzir um resultado de 32 bits. Aceite entradas no stdin, separadas por vírgulas, espaços ou novas linhas (sua escolha), mas deixe claro como inserir os dados.
Exemplo de entrada / saída:
734 929
681886
code-golf
math
restricted-source
Thomas O
fonte
fonte
Respostas:
C,
848378 caracteresDe uma forma mais legível
O algoritmo é mais conhecido como Multiplicação Etíope ou Multiplicação Camponesa Russa. Aqui está o algoritmo:
fonte
m=0
(pelo menos para mim)for(;(a&1&&m+=b)|a;a>>=1,b<<=1);
Sim, eu estou muito envergonhado. :)for(m=0;(a&1&&m+=b)|a;a/=2,b*=2);
por que usar shift, certo?b+=b
vez deb*=2
. Claro, você ainda precisará da mudança certa.APL (5)
Recebe entrada na entrada padrão, separada por novas linhas.
fonte
Golfscript - 12 caracteres
Observe que
*
aqui não é o operador de multiplicação, é um operador de repetição; veja o segundo uso aqui .fonte
Golfscript - 27 caracteres
Multiplicação de camponeses. Há primeiro * lá é uma multiplicação, mas apenas por 0 ou 1
Aqui estão 31 caracteres que não se multiplicam
fonte
Python, 64 caracteres
Provavelmente não é o mais eficiente (ou o mais compatível, mas estou "adicionando", não sou?):
fonte
input()
no lugar deint(raw_input())
para salvar 18 caracteres. Você pode considerar essa trapaça, masprint sum([input()]*input())
também funciona (*
está sendo usado para repetição, não para multiplicação).r=input;a=r();print sum(map(lambda x:a,range(r())))
é muito menorr=input;a=r();r(sum(a for b in range(r())))
é ainda mais curtos (43 vs 51 bytes)Ruby, 30
Baseado na resposta do GigaWat .
fonte
Golfscript - 43
Implementação da multiplicação camponesa . Acho que vou poder jogar golfe mais tarde.
fonte
J,
1817 caracteresA entrada precisa ser separada por espaço.
fonte
Python, também 64 caracteres
fonte
i=input
e utilizaçãoi()
0 if n==0 else
porn and
VBA, 70 caracteres
Na verdade, isso é bastante lento para grandes números, mas é pequeno.Consegui melhorar o tamanho do código e melhorar a velocidade. O tempo de cálculo varia, dependendo da posição do argumento - não apenas do tamanho. (ou seja, 1000, 5000 calcula em cerca de 4 segundos, enquanto 5000, 1000 calcula em cerca de 19). Como o OP lista tanto rápido quanto pequeno, imaginei que iria com esse. A entrada é dois argumentos numéricos, separados por vírgula.Esta versão mais longa ( 103 caracteres ) garantirá que seja executada com o mais rápido dos dois arranjos possíveis:
fonte
To
e na concatenação, bem como por outputiing a janela imediata o VBE viaDebug.?
Perl: 52 caracteres
Esta é uma pergunta antiga, mas o Perl precisa ser representado:
(Este é o algoritmo binário, além iterado é menor, mas maneira muito chato.)
Este programa inclui um recurso não intencional: se sua linha de entrada contiver um terceiro número, o programa realmente calculará A * B + C.
fonte
Uma variação no Scala, otimizada para tamanho: 48 caracteres
otimizado um pouco para velocidade:
Troco (a, b) se (a> b), para chegar ao fim mais rapidamente. A diferença é de 11 a 20 etapas, ao chamar mul (1023,31), em comparação com a omissão dessa linha de código.
golfed: 95 caracteres:
fonte
K,
1816.
fonte
Ruby, 35 caracteres
p $*.map!(&:to_i).pop*$*.inject(:+)
É um programa , que recebe entradas e saídas, não apenas uma função.
fonte
Ruby, 35 bytes
Uso:
x([123, 456]) #=> 56088
Provavelmente poderia ser reduzido se os números forem lidos no ARGV, mas reclama que eles estão no formato errado (cadeias de caracteres, não ints). Qualquer sugestão seria ótima.
fonte
Mathematica 12
As seguintes somas
#2
instâncias de#1
.Código
Uso
9 caracteres?
Se os parâmetros do programa,
a
,b
, pode ser usado para a entrada, o mesmo resultado pode ser alcançado com 9 caracteres .fonte
VB11, 101 Chars
fonte
==
) não são permitidas pela pergunta, mas muitas respostas as estão usando.