Schreiben Sie den schnellsten (besten Big-O) und kleinsten Multiplikationsalgorithmus für positive ganze Zahlen, ohne Multiplikationsoperatoren zu verwenden. Sie dürfen nur Addition, Subtraktion, logische Funktionen (UND, ODER, XOR, NICHT), Bitverschiebung, Bitdrehung, Bit-Flip / Set / Clear und Bittest durchführen. Ihr Programm sollte in der Lage sein, 16-Bit-Zahlen zu multiplizieren, um ein 32-Bit-Ergebnis zu erzielen. Nehmen Sie Eingaben in stdin vor, getrennt durch Kommas, Leerzeichen oder neue Zeilen (nach Ihrer Wahl), aber machen Sie deutlich, wie die Daten eingegeben werden sollen.
Beispiel für eine Ein- / Ausgabe:
734 929
681886
code-golf
math
restricted-source
Thomas O.
quelle
quelle
Antworten:
C,
848378 ZeichenIn einer besser lesbaren Form
Der Algorithmus ist besser bekannt als die äthiopische Multiplikation oder die russische Bauernmultiplikation. Hier ist der Algorithmus:
quelle
m=0
(zumindest für mich)for(;(a&1&&m+=b)|a;a>>=1,b<<=1);
Ich habe diesen vergessen, hier ist ein kürzerer. Ja, ich schäme mich sehr. :)for(m=0;(a&1&&m+=b)|a;a/=2,b*=2);
Warum Shift verwenden, richtig?b+=b
stattdessen sagenb*=2
. Natürlich brauchen Sie immer noch die richtige Schicht.APL (5)
Übernimmt Eingaben für Standardeingaben, die durch Zeilenumbrüche getrennt sind.
quelle
Golfscript - 12 Zeichen
Bitte beachten Sie, dass
*
hier nicht der Multiplikationsoperator, sondern ein Wiederholungsoperator ist, siehe die zweite Verwendung hier .quelle
Golfscript - 27 Zeichen
Bauernvermehrung. Dort zuerst * gibt es eine Multiplikation, aber nur mit 0 oder 1
Hier ist bei 31 Zeichen, die sich überhaupt nicht multiplizieren
quelle
Python, 64 Zeichen
Wahrscheinlich nicht die effizienteste (oder die konformste, aber ich "füge hinzu", nicht wahr?):
quelle
input()
anstelle vonint(raw_input())
18 Zeichen speichern. Sie könnten dieses Betrügen in Betracht ziehen, aberprint sum([input()]*input())
es funktioniert auch (*
wird zur Wiederholung und nicht zur Multiplikation verwendet).r=input;a=r();print sum(map(lambda x:a,range(r())))
ist viel kürzerr=input;a=r();r(sum(a for b in range(r())))
ist noch kürzer (43 vs 51 Bytes)Ruby, 30
Basierend auf der GigaWat-Antwort .
quelle
Golfscript - 43
Umsetzung der Bauernvermehrung . Ich denke, ich kann später vielleicht noch mehr Golf spielen.
quelle
J,
1817 ZeichenDie Eingabe muss durch Leerzeichen getrennt werden.
quelle
Python, auch 64 Zeichen
quelle
i=input
i()
0 if n==0 else
durchn and
VBA, 70 Zeichen
Dies ist für große Zahlen eigentlich ziemlich langsam, aber es ist klein.Ich habe es geschafft, die Codegröße zu verbessern und gleichzeitig die Geschwindigkeit zu verbessern. Die Berechnungszeit variiert je nach Position des Arguments - nicht nur der Größe. (dh 1000, 5000 werden in ungefähr 4 Sekunden berechnet, während 5000, 1000 in ungefähr 19 Sekunden berechnet werden.) Da das OP sowohl schnell als auch klein auflistet, dachte ich, ich würde mit diesem gehen. Die Eingabe besteht aus zwei numerischen Argumenten, die durch Kommas getrennt sind.Diese längere Version ( 103 Zeichen ) stellt sicher, dass sie mit der schnelleren der beiden möglichen Anordnungen ausgeführt wird:
quelle
To
und in der Verkettung entfernen sowie überDebug.?
Perl: 52 Zeichen
Dies ist eine alte Frage, aber Perl muss vertreten sein:
(Dies ist der binäre Algorithmus; iterierter hinaus ist kleiner , aber Art und Weise zu langweilig.)
Dieses Programm enthält eine unbeabsichtigte Funktion: Wenn Ihre Eingabezeile eine dritte Zahl enthält, berechnet das Programm tatsächlich A * B + C.
quelle
Eine Variation in Scala, optimiert für Größe: 48 Zeichen
ein bisschen auf Geschwindigkeit optimiert:
Ich tausche (a, b) wenn (a> b), um das Ende schneller zu erreichen. Der Unterschied beträgt 11 bis 20 Schritte beim Aufrufen von mul (1023,31), verglichen mit dem Weglassen dieser Codezeile.
Golf: 95 Zeichen:
quelle
K,
1816.
quelle
Ruby, 35 Zeichen
p $*.map!(&:to_i).pop*$*.inject(:+)
Es ist ein Programm , das Ein- und Ausgänge übernimmt, nicht nur eine Funktion.
quelle
Ruby, 35 Bytes
Verwendungszweck:
x([123, 456]) #=> 56088
Könnte wahrscheinlich verkürzt werden, wenn die Zahlen aus ARGV gelesen werden, aber es wird beanstandet, dass sie das falsche Format haben (Zeichenfolgen, keine Ints). Irgendwelche Vorschläge wären toll.
quelle
Mathematica 12
Die folgenden Summeninstanzen
#2
von#1
.Code
Verwendungszweck
9 Zeichen?
Wenn Programmparameter
a
,b
für die Eingabe verwendet werden kann, kann das gleiche Ergebnis erreicht werden durch 9 Zeichen .quelle
VB11, 101 Zeichen
quelle
==
) sind in der Frage nicht erlaubt, aber viele Antworten verwenden sie.