Neulich erklärte mir mein Chemielehrer die wissenschaftliche Notation (indem er eine kleine Zahl verwendete und sie mit Zehnerpotenzen multiplizierte, um große Zahlen leichter auszudrücken), was mich ein paar Jahre zurückbrachte, als ich sie zum ersten Mal lernte. Nachdem wir die Grundlagen erlernt hatten, hatten wir einige typische mathematische Fragen gestellt, von denen einige wie folgt lauteten:
Stellen Sie in der wissenschaftlichen Schreibweise Folgendes dar:
a) 50000000
b) 120000000000000
c) 900000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
Und ich dachte: "Was? Uns wurde gesagt, dass die wissenschaftliche Notation verwendet wurde, um das Schreiben großer Zahlen effizienter zu machen, aber einige Fälle sind überhaupt nicht effizienter!"
Betrachten Sie die Nummer
300
und seine Darstellung in wissenschaftlicher Notation:
3x10^2
Was, die wissenschaftlich notierte Version nimmt tatsächlich mehr Platz ein? Das können wir jetzt nicht haben, oder? (Der Platz auf dem Bildschirm ist kostbar.)
Wir könnten selbst bestimmen, ob es platzsparender ist, eine Zahl in wissenschaftlicher Notation zu schreiben oder nicht, oder ...
Aufgabe
Ihr Programm oder Ihre Funktion sollte eine einzelne positive Zahl nbeliebiger Größe (bis zu der von Ihrer Sprache unterstützten Größe) als Eingabe verwenden und die wissenschaftlich notierte Version der Zahl ausgeben.
Wenn die ursprüngliche Nummer nnach dem Entfernen der nachgestellten Nullen und der nachgestellten Dezimalstelle weniger oder weniger Zeichen als die wissenschaftlich notierte Version enthält, müssen Sie nstattdessen diese ursprüngliche Nummer ausgeben .
Ihr Code muss so kurz wie möglich sein, da die Ausgabe auch so kurz wie möglich sein muss.
Spezifikationen
Efficient Scientific Notation ist wie folgt definiert:
bx10^e
bist die Eingangszahl, die durch Zehnerpotenzen geteilt wird, so dass 1 <= b < 10. Bei dieser Zahl müssen alle nachgestellten Nullen (und gegebenenfalls der Dezimalpunkt) entfernt werden. Sie muss jedoch die Genauigkeit der ursprünglichen Zahl aufweisen (natürlich bis zum Dezimalpunkt in Ihrer Sprache). Dh 90000wird 9, 13.500wird 1.35, 0.000675wird 6.75usw. Wenn diese Zahl mehr Dezimalstellen enthält, als Ihre Sprache verarbeiten kann, sollte sie auf diese maximale Anzahl von Dezimalstellen gerundet werden.
eist der Exponent, auf den zehn erhöht werden n = b x 10^e(denken Sie daran, dass diese Zahl negativ sein muss, wenn sie nkleiner als 1 ist). Diese Zahl sollte keine nachgestellten Nullen oder Dezimalstellen enthalten (hauptsächlich, weil etwas nicht stimmt, wenn es sich nicht um eine Ganzzahl handelt ...).
Die Zeichen x10^ müssen so bleiben, wie sie in der Zeichenfolge zwischen bund stehen e.
Testfälle
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Andere Regeln und Erläuterungen
- Nachgestellte Nullen (und / oder Nachkommastellen) werden nicht auf die Anzahl der Zeichen der ursprünglichen Eingabenummer angerechnet
n. Beachten Sie dies in Fällen wie Testfall 6 - Sie können davon ausgehen, dass die eingegebene Zahl, wenn sie kleiner als 1 ist, immer mit einer 0 für die Einerstelle beginnt (wie in den Testfällen 5-8).
- Die eingegebene Nummer wird niemals negativ sein
- Eingebaute Elemente, die diese Herausforderung zu trivialen und standardmäßigen Schlupflöchern machen, sind nicht zulässig
- Eine nachfolgende Zeile in der Ausgabe ist OK
EDIT
Dank user81655 für den Hinweis auf Testfälle 7 und 8 hatten falsche Zehnerpotenzen. Ich habe diese jetzt behoben, also stellen Sie sicher, dass Ihr Code sie korrekt auswertet.
e9000 -> 9e3
x10^. Und es wäre ein gutes Stück Überarbeitung der Frage, die ich jetzt, wo sie veröffentlicht ist, nicht für angemessen halte
pi^e^i^j^k^std::vectorwäre?