На днях мой учитель химии объяснял нам научную нотацию (используя небольшое число и умножая ее на десятикратные числа, чтобы легче выразить большие числа), что вернуло меня на несколько лет назад, когда я впервые выучил это. Изучив основы, мы выполнили несколько типичных математических вопросов, некоторые из которых были похожи на следующие:
Представьте следующее в научной записи:
а) 50000000
б) 120000000000000
в) 90000000000000000000000000000000000000
г) пи ^ е ^ я ^ j ^ k ^ std :: vector
...
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).
- Входной номер никогда не будет отрицательным
- Встроенные модули, которые делают эту задачу тривиальной, и стандартные лазейки запрещены
- Завершающий перевод строки в выводе в порядке
РЕДАКТИРОВАТЬ
Спасибо пользователю 81655 за указание на контрольные примеры 7 и 8 имели неправильные полномочия десять. Я исправил их, поэтому убедитесь, что ваш код правильно их оценивает.
e
: 9000 -> 9e3
(почти более 9 000 !)
x10^
. И это было бы довольно доработкой по этому вопросу, который я не считаю уместным сейчас, когда он был опубликован
pi^e^i^j^k^std::vector
?