L'altro giorno il mio insegnante di chimica ci stava spiegando della notazione scientifica (usando un piccolo numero e moltiplicandolo per poteri di dieci per esprimere più facilmente un gran numero), il che mi ha riportato indietro di alcuni anni a quando l'ho imparato per la prima volta. Dopo aver appreso le nozioni di base, avevamo fatto una serie di domande matematiche tipiche, alcune delle quali erano le seguenti:
Rappresenta quanto segue in notazione scientifica:
a) 50000000
b) 120000000000000
c) 9000000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
E ho pensato: "Cosa? Ci è stato detto che la notazione scientifica è stata usata per rendere più efficiente la scrittura di grandi numeri, ma alcuni casi non sono affatto più efficienti!"
Considera il numero
300
e la sua rappresentazione in notazione scientifica:
3x10^2
Cosa, la versione scientificamente notata occupa effettivamente più spazio? Non possiamo averlo adesso, vero? (Lo spazio sullo schermo è prezioso.)
Potremmo determinare noi stessi se è più efficiente nello spazio scrivere un numero in notazione scientifica o no, oppure ...
Compito
Il tuo programma o funzione dovrebbe assumere come input un singolo numero positivo ndi dimensioni arbitrarie (fino a ciò che la tua lingua supporta) e produrre la versione scientificamente notata del numero.
Tuttavia, se il numero originale n, dopo la rimozione degli zeri finali e del decimale finale, richiede meno o la stessa quantità di caratteri da visualizzare rispetto alla sua versione notata scientificamente, è necessario invece generare quel numero originale n.
Il codice deve essere il più breve possibile perché anche l'output deve essere il più breve possibile.
specificazioni
La notazione scientifica efficiente è definita come segue:
bx10^e
bè il numero di input opportunamente diviso per poteri di 10 tali che 1 <= b < 10. Questo numero deve avere tutti gli zero finali (e il punto decimale, se necessario) rimossi, ma deve avere la precisione del numero originale (fino al limite del punto decimale nella tua lingua, ovviamente). Cioè 90000diventa 9, 13.500diventa 1.35, 0.000675diventa 6.75ecc. Se questo numero finisce per contenere più cifre decimali di quante la tua lingua possa gestire, dovrebbe essere arrotondato al numero massimo di posizioni decimali.
eè l'esponente a cui dieci viene elevato in modo tale n = b x 10^e(ricordare che questo numero deve essere negativo se nè inferiore a 1). Questo numero non dovrebbe avere zeri finali o un decimale (principalmente perché se non è un numero intero qualcosa non va ...).
I caratteri x10^ devono rimanere come nella stringa tra be e.
Casi test
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
punteggio
Questo è code-golf , quindi vince il codice più breve in byte.
Altre regole e chiarimenti
- Gli zeri finali (e / o il punto decimale finale) non vengono conteggiati nel conteggio dei caratteri del numero di input originale
n. Tienilo a mente per casi come il test case 6 - Si può presumere che se il numero di input è inferiore a 1, inizierà sempre con uno 0 in atto per quelle cifre (come nei casi di test 5-8).
- Il numero di input non sarà mai negativo
- Gli built-in che rendono questa sfida banale e le scappatoie standard non sono consentite
- Una nuova riga finale nell'output è OK
EDIT
Grazie a user81655 per aver segnalato i casi di test 7 e 8 avevano poteri errati di dieci. Ora li ho riparati, quindi assicurati che il tuo codice li valuti correttamente.
e9000 -> 9e3
x10^. E sarebbe una buona dose di rielaborazione della domanda, che non credo sia così appropriata ora che è stata pubblicata
pi^e^i^j^k^std::vectorsarebbe l'output per l'input ?