Implementieren Sie eine Funktion divide(int a, int b, int c)
, die den Basis-10-Wert von ausgibt a/b
. ohne Verwendung von Gleitkomma-Mathematik oder BigInteger
/ BigDecimal
und äquivalenten Bibliotheken. Mit Ausnahme der (möglichen) Ausnahme in Punkt 4 müssen mindestens c
genaue Zeichen innerhalb des Satzes 0123456789.
gedruckt werden.
a
undb
kann eine beliebige 32-Bit-Ganzzahl sein. Update: Wenn Sie zu Golfzwecken eine Eingabe mit 64-Bit-Grundelementen wünschen, ist dies in Ordnung, Sie müssen jedoch nicht den gesamten 64-Bit-Datenbereich unterstützen.- Sie müssen nicht überprüfen, ob dies
c
positiv ist (obwohl Ihr Programm hoffentlich nicht abstürzt), wenn dies nicht der Fall ist. - Die unterstützte Mindestobergrenze für
c
ist500
. Es ist in Ordnung, wenn Ihr Programm diec
obigen Werte nicht unterstützt500
, aber es ist auch in Ordnung, wenn dies der Fall ist. - Bei gleichmäßig verteilten Zahlen können Sie wählen, ob Sie zusätzliche Nullen (basierend auf dem Wert von
c
) oder nichts drucken möchten . - Sie müssen die Funktion nicht verwenden können, um weitere Aufgaben mit dem Quotienten auszuführen. Das einzige Ziel ist das Drucken.
- Bei Zahlen zwischen
-1
und1
haben Sie die Wahl, ob Sie einen Zeilenumbruch drucken möchten0
. Dies ist jedoch das einzige Szenario, in dem das Drucken einer führenden Null zulässig ist und Sie möglicherweise nur eine solche Null drucken. - Sie können für die letzte Dezimalstelle eine beliebige Rundungs- / Floor- / Ceil-Logik verwenden, die Sie bevorzugen.
- Für eine negative Antwort müssen Sie eine führende drucken
-
. Dies zählt nicht dazuc
. Aber es ist Ihre Wahl , wenn Sie drucken möchten,
+
oder nichts für eine positive Antwort. - Sowohl Ganzzahlteilung als auch Ganzzahlmodul sind zulässig. Denken Sie jedoch daran , dass Sie auf Primitiven beschränkt sind, es sei denn , Sie wählen Sie Ihre eigene implementieren
BigInteger
/BigDecimal
Bibliothek , die zählt gegen Ihre Codelänge. - Sie müssen nicht behandeln müssen
b
sein0
, wenn Sie können , wenn Sie wollen. Ihr Programm kann in eine Endlosschleife eintreten oder abstürzen, wennb=0
, und Sie werden nicht bestraft. - Leichte Regeländerung pro Kommentar. Um sicherzustellen, dass das Spielfeld eben ist
a
undb
garantiert 32-Bit-Ganzzahlen aufweist, können Sie 64-Bit-Ganzzahlen verwenden. Wenn Ihre gewählte Sprache mehr als 64-Bit-Ganzzahlen als Grundelement enthält, können Sie diese Funktionalität zu keinem Zeitpunkt verwenden (so tun, als wäre sie auf 64-Bit begrenzt). - Ein weiterer Punkt, der unklar ist (er sollte jedoch keine der aktuell gültigen Antworten ändern): Während er
c
entweder als die Anzahl der gedruckten Zeichen oder die Anzahl der Nachkommastellen interpretiert werden kann, muss Ihr Programm siec
auf eine relevante Weise verwenden um zu entscheiden, wie viele Zeichen gedruckt werden sollen. Mit anderen Wortendivide(2,3,2)
sollte die Ausgabe viel kürzer sein alsdivide(2,3,500)
; Es ist nicht in Ordnung, 500 Zeichen ohne Rücksicht auf zu druckenc
. - Der Name der Funktion ist mir eigentlich egal.
d
ist für Golfzwecke in Ordnung.
Eingang
Es wird sowohl ein Funktionsaufruf als auch ein Lesevorgang stdin
akzeptiert. Wenn Sie von lesen stdin
, wird jedes Zeichen, das nicht in der Menge enthalten [-0123456789]
ist, als Argumentbegrenzer betrachtet.
Ausgabe
Zeichen bis stdout
wie oben beschrieben.
Beispiel
für divide(2,3,5)
alle die folgenden sind akzeptabel Ausgänge:
0.666
0.667
.6666
.6667
0.666
0.667
.6666
.6667
+0.666
+0.667
+.6666
+.6667
Ein weiteres Beispiel: Für divide(371,3,5)
die folgenden sind alle akzeptablen Ausgaben:
123.6
123.7
123.6
123.7
+123.6
+123.7
123.66666
123.66667
123.66666
123.66667
+123.66666
+123.66667
Und für divide(371,-3,5)
die folgenden sind alle akzeptabel:
-123.6
-123.7
-123.66666
-123.66667
92,3,5
das tust, wäre die Antwort zum Beispiel30.67
Antworten:
Java, 92/128
Ich musste improvisieren, damit
a
oderb
konnte -2147483648 als positive 32-Bit-Ganzzahlen nur gegen 2147483647 zählen, deshalba
wurde einlong
. Es könnte eine bessere Möglichkeit geben, mit negativen Ergebnissen umzugehen, aber ich weiß, dass es keine gibt (double
wahrscheinlich würde dies funktionieren,abs(a) < abs(b)
da es sie gibt,-0
aber nur das Komplement der einen würde die Präzision bewahren).Warum zwei Bytes? Ich brauchte 92 Bytes für die Berechnung und 36 für den Print-Helfer (
System.out.print
saugt; Java ist im Allgemeinen nicht so golfen).Die Methode verwendet im Wesentlichen das, was die meisten von uns in der Schule gelernt haben, um die gewünschten Dezimalstellen zu generieren.
quelle
Integer.MIN_VALUE
nicht in Ordnung ist, aber daslong
als Eingabe ist in Ordnung.System.out
Java sperrig machen ;-) Immer noch ein gutes Gefühl, dass es schon längere Antworten gibt.C
989589druckt
c
Ziffern nach dem.
Beispielausgabe:
sollte für -2147483647 <= a <= 2147483647 funktionieren, dasselbe gilt für b. Der Umgang mit dem
-
war ein Schmerz.Online-Version: ideone
quelle
a=-a
.printf("-")
1 zurückgegeben wird.PHP, 108
Es funktioniert durch einfaches Ausgeben des Quotienten aus
a
/b
während einerc
Schrittschleife,a
wobei der Rest bei jeder Iteration mit 10 multipliziert wird.DEMO
quelle
function d($a,$b,$c){if($a*$b<0)$a*=-print'-';for($p='.';$c--;$a*=10,$p=''){$a-=$b*$i=($a-$a%$b)/$b;echo$i.$p;}}
Python 111
Diese Lösung verletzt keine der angegebenen Regeln.
quelle
C: 72 Zeichen
Es macht fast alles, was es machen soll. Jedoch wird es wie einige der anderen Antworten hier Wonky-Werte geben oder scheitern
d(-2147483648,b,c)
undd(a,-2147483648,c)
da der absolute Wert von -2147483648 für ein 32-Bit-Wort außerhalb der Grenzen liegt.quelle
Perl, keine Arithmetik, 274 Bytes
Dies ist eine euklidische lange Teilung, die wahrscheinlich ungewöhnlich viel Speicher verbraucht. Der beste Weg, um Gleitkommazahlen zu berechnen, ist die Verwendung von Bitoperationen, um sie zu analysieren.
Beispiele:
Ausgabe:
quelle
Rubin, 178
Online-Version zum Testen.
Der Trick besteht darin, a mit einer ziemlich hohen Zahl zu multiplizieren , sodass das Ergebnis nur ein ganzzahliges Vielfaches der Gleitkommaoperation ist. Dann müssen der Punkt und die Nullen an der richtigen Stelle in die resultierende Zeichenfolge eingefügt werden.
quelle
g
man bei großen über 64 bits hinausc
? Bearbeiten: Ich glaube, Sie verwenden implizitBigInteger
hierg
ist eine Zeichenfolge, aber bevor Sie anrufen, habento_s
Sie eine Nummer im Speicher erstellt, diePython 92 Bytes:
Ich denke, noch mehr Golf ist möglich .....
quelle
e
jenseits von 64 Bit für große c? Bearbeiten: Ich denke, Sie verwenden implizitBigInteger
hier.a=5
undc=400
dann danache=10**c
, in hex, ist die Zahl 333 Stellen lang. Es beginnt,8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...
dies ist mehr als 64 Bit.C 83
Dieselbe Idee, die ich in meiner Python-Implementierung verwendet habe
quelle
d(-2147483648,-1,10)