Wenn Sie einen Bruch in eine Dezimalzahl umwandeln und diese Zahl speichern möchten, müssen Sie sie häufig runden, da Sie nur eine bestimmte Menge an Speicher verwenden möchten. Angenommen, Sie können nur 5 Dezimalstellen speichern, dann wird 5/3 zu 1,6667. Wenn Sie nur 2 Dezimalstellen speichern können, beträgt diese 1,7 (jetzt wird angenommen, dass sie immer zwischen 0 und 9,99 liegt ...).
Wenn Sie nun versuchen, diesen Prozess mit 1.7 umzukehren und Ihren Bruch wieder herzustellen, kann dies schwierig sein, da Sie wissen, dass 1.7 nur eine gerundete Zahl ist. Natürlich können Sie 17/10 probieren, aber das ist eher ein "hässlicher" Bruchteil im Vergleich zum "eleganten" 5/3.
Das Ziel ist es nun, den Bruch a / b mit dem kleinsten Nenner b zu finden, der bei richtiger Rundung die gerundete Dezimalzahl ergibt.
Einzelheiten
Die Eingabe enthält eine Zeichenfolge mit einer Zahl von 1 bis 5 Ziffern, die zwischen 0 (einschließlich) und 10 (nicht einschließlich) mit einem '.' nach der ersten Ziffer. Angenommen, n
die Anzahl der Stellen. Die Ausgabe muss eine Liste / ein Array mit zwei Ganzzahlen [numerator, denominator]
oder ein rationaler Datentyp sein (Sie können einen eigenen Datentyp erstellen oder einen integrierten Datentyp verwenden), bei dem der Zähler nicht negativ und der Nenner positiv ist. Der Bruchzähler / Nenner muss der Eingabe entsprechen, wenn er korrekt auf n
Ziffern gerundet ist (dh n-1
Ziffern nach dem Komma).
Einschränkung: Es ist nur eine Schleifenanweisung zulässig. Dies bedeutet, dass Sie nur eine einzige Schleifenanweisung (wie for
oder while
oder goto
usw.) sowie funktionale Schleifen wie map
oder fold
, die Code auf jedes Element einer Liste / eines Arrays anwenden) in Ihrem gesamten Code verwenden können, aber Sie können ihn "missbrauchen" oder benutze Rekursion etc.
Sie sollten eine Funktion schreiben. Wenn Ihre Sprache keine Funktionen hat (oder auch nicht), können Sie alternativ davon ausgehen, dass die Eingabe in einer Variablen gespeichert ist (oder über stdin eingegeben wird), und das Ergebnis ausdrucken oder in eine Datei schreiben. Die niedrigste Anzahl von Bytes gewinnt.
Runden
Die Rundung sollte nach den „herkömmlichen“ Rundungsregeln erfolgen. Wenn also die letzte Stelle, die abgeschnitten wird, 5 oder mehr beträgt, runden Sie auf und runden für alle anderen Fälle ab. Beispiel:
Beim Runden auf ergibt sich 4.5494
- 1 Ziffer: 5
- 2 Stellen: 4.5
- 3 Stellen: 4,55
- 4 Stellen: 4,549
Beispiele
Bitte geben Sie folgende und andere 'interessante' Testfälle an:
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
äquivalent zu map(f, map(g, numbers))
. Die Funktionsversion verwendet map
zweimal, sollte das wirklich verboten sein?
repeat
erstellt eine unendliche Liste seines Arguments. Es scheint sich zu wiederholen, aber es hat tatsächlich die zeitliche Komplexität von O (1). Aber ich denke, es ist besser, jeden Fall einzeln zu sortieren, als keine funktionalen Sprachen zuzulassen.