Outro dia, meu professor de química estava nos explicando sobre a notação científica (usando um número pequeno e multiplicando-o por potências de dez para expressar números grandes com mais facilidade), o que me trouxe de volta alguns anos depois que a aprendi. Depois de aprender o básico, fizemos várias perguntas típicas de matemática, algumas das quais eram as seguintes:
Represente o seguinte na notação científica:
a) 50000000
b) 120000000000000
c ) 900000000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vetor
...
z) 200
...
E pensei: "O quê? Disseram-nos que a notação científica era usada para tornar a escrita de grandes números mais eficiente, mas alguns casos não são mais eficientes!"
Considere o número
300
e sua representação na notação científica:
3x10^2
O que, a versão cientificamente notada ocupa realmente mais espaço? Não podemos ter isso agora, podemos? (O espaço na tela é precioso.)
Poderíamos determinar se é mais eficiente em termos de espaço escrever um número em notação científica ou não, ou ...
Tarefa
Seu programa ou função deve ter como entrada um número positivo único n
de tamanho arbitrário (até o que o seu idioma suporta) e gerar a versão do número anotada cientificamente.
No entanto, se o número original n
, após a remoção dos zeros à direita e da casa decimal à direita, levar menos ou a mesma quantidade de caracteres a serem exibidos que a versão cientificamente notada, você deverá gerar esse número original n
.
Seu código precisa ser o mais curto possível, porque a saída também deve ser o mais curta possível.
Especificações
Notação científica eficiente é definida da seguinte forma:
bx10^e
b
é o número de entrada dividido adequadamente por potências de 10, de modo que 1 <= b < 10
. Esse número deve ter todos os zeros à direita (e o ponto decimal, se necessário) removidos, mas deve ter a precisão do número original (até o limite de pontos decimais no seu idioma, é claro). Ou seja, 90000
torna-se 9
, 13.500
torna-se 1.35
, 0.000675
torna-se 6.75
etc. Se esse número extremidades se contendo mais lugares decimais do que o idioma pode segurar, ele deve ser arredondada para o número máximo de casas decimais.
e
é o expoente ao qual dez é aumentado, de modo que n = b x 10^e
(lembre-se de que esse número precisa ser negativo se n
for menor que 1). Esse número não deve ter zeros à direita ou uma casa decimal (principalmente porque, se não for um número inteiro, algo está errado ...).
Os caracteres x10^
devem permanecer como estão na sequência entre b
e e
.
Casos de teste
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
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence.
Outras regras e esclarecimentos
- Zeros à direita (e / ou casa decimal à direita) não são contados na contagem de caracteres do número de entrada original
n
. Lembre-se disso em casos como o caso de teste 6 - Você pode supor que, se o número de entrada for menor que 1, ele sempre começará com um 0 no lugar dos dígitos (como nos casos de teste 5-8).
- O número de entrada nunca será negativo
- Built-ins que tornam esse desafio trivial e brechas padrão não são permitidos
- Uma nova linha à direita na saída está OK
EDIT
Agradecemos ao user81655 por apontar os casos de teste 7 e 8 com poderes incorretos de dez. Eu os corrigi agora, portanto, verifique se o código os avalia corretamente.
e
: 9000 -> 9e3
(quase mais de 9.000 !)
x10^
. E seria um pouco de retrabalho sobre a questão, que eu não acho que é que apropriado agora que ele postou
pi^e^i^j^k^std::vector
?