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 nde 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, 90000torna-se 9, 13.500torna-se 1.35, 0.000675torna-se 6.75etc. 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 nfor 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 be 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?