Днями мій викладач хімії пояснював нам наукові позначення (використовуючи невелику кількість і множивши її на сили десять, щоб легше виразити велику кількість), що повернуло мене кілька років назад, коли я вперше дізнався це. Вивчивши основи, ми зробили купу типових питань з математики, деякі з яких були такі:
У науковій позначці представіть наступне:
а) 50000000
б)
120000000000000 в) 90000000000000000000000000000000000000
г) пі ^ е ^ я ^ j ^ k ^ std :: вектор
...
z) 200
...
І я подумав: "Що? Нам сказали, що наукові позначення використовуються для того, щоб зробити письмове число більш ефективним, але деякі випадки взагалі не є більш ефективними!"
Розглянемо число
300
та його представлення в науковій нотації:
3x10^2
Що, науково позначена версія фактично займає більше місця? Ми не можемо цього мати, чи не так? (Екранний простір дорогоцінний.)
Ми могли б визначити себе, чи більш просторовим є використання числа в науковій нотації чи ні, або ...
Завдання
Ваша програма або функція повинна приймати як вхід одне додатне число n
довільного розміру (до того, що підтримує ваша мова) і виводити науково позначену версію номера.
Однак якщо оригінальне число n
після вилучення проміжних нулів та знаків після коми містить менше або стільки ж символів, скільки його науково-помічена версія, n
замість цього потрібно вивести це оригінальне число .
Ваш код повинен бути якомога коротшим, оскільки вихід також повинен бути якомога коротшим.
Технічні умови
Ефективне наукове позначення визначається так:
bx10^e
b
- це вхідне число, відповідним чином поділене на потужності 10, що 1 <= b < 10
. У цього числа повинні бути видалені всі проміжні нулі (і десяткова крапка, якщо це потрібно), але має бути точність початкового числа (звичайно, до межі десяткової крапки у вашій мові, звичайно). Тобто 90000
стає 9
, 13.500
стає 1.35
, 0.000675
стає 6.75
і т. Д. Якщо це число в кінці містить більше десяткових знаків, ніж може обробляти ваша мова, його слід округлювати до максимальної кількості десяткових знаків.
e
- це показник, до якого десять піднімається таким, що n = b x 10^e
(пам'ятайте, що це число має бути від'ємним, якщо n
воно менше 1). У цьому числі не повинно бути жодних крапок чи десяткових знаків (головним чином, тому що, якщо це не ціле число, щось не так ...).
Символи x10^
повинні залишатися такими, які є в рядку між b
і e
.
Тестові справи
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
Оцінка балів
Це код-гольф , тому найкоротший код у байтах виграє.
Інші правила та уточнення
- Задні нулі (та / або десятковий знак після коми) не зараховуються до числа символів вихідного вхідного номера
n
. Майте це на увазі для таких випадків, як тестовий випадок 6 - Можна припустити, що якщо число введення менше 1, воно завжди починатиметься з 0 на тій цифрі (як у тестових випадках 5-8).
- Число введення ніколи не буде від’ємним
- Вбудовані модулі, які роблять цей виклик тривіальним, а стандартні лазівки заборонені
- Зворотний новий рядок у виводі
EDIT
Завдяки користувачеві81655 за вказівку тестових випадків 7 та 8 мали неправильні повноваження десять. Зараз я виправив їх, тому переконайтеся, що ваш код правильно їх оцінює.
e
: 9000 -> 9e3
(майже понад 9000 !)
x10^
. І було б справедливо трохи переробити питання, яке, на мою думку, не підходить зараз, коли воно розміщено
pi^e^i^j^k^std::vector
?