Сравните два числа с плавающей запятой, заданные в научной нотации.
Даны две строки N и M в виде a * 10 b . Задача состоит в том, чтобы сравнить данные два числа с плавающей запятой и вывести меньшее число , а если оба числа равны, то вывести равно.
0<|a|<10^9 and -10^9<b<10^9.
Пример:
N and M are two numbers with two parts:
- a1 is mantissa of N and a2 is mantissa of M.
- b1 is exponent of N and b2 is exponent of M.
Input: N = 3*10^2, M = 299*10^0
Output: M
Explanation:
a1 = 3, b1 = 2
a2 = 299, b2 = 0
N = 3*10^2 = 300
M = 299*10^0 = 299.
We know that 299 is smaller than 300.Input: N = -5*10^3, M = -50*10^2
Output : Equal
Explanation:
a1 = -5, b1 = 3
a2 = -50, b2 = 2
N = -5*10^3 = -5000
M = -50*10^2 = -5000
Hence, N and M are equal.Input: N = -2*10^1, M = -3*10^1
Output: M
Explanation:
a1 = -2 , b1 = 1
a2 = -3 , b2 = 1
N = -20
M = -30
-30 is less than -20, hence M is smaller number.
Наивный подход: мы посчитаем значения чисел, извлеченных из строк N и M, а затем сравним, какое из них лучше. Класс bigInteger будет использоваться для хранения и вычисления значений N и M в Java. Этот подход может привести к ошибке Time Limit Exceeded для больших тестовых случаев.
Оптимальный подход:
- Извлеките мантиссу и показатели из обеих строк N и M.
- Найдите индекс '*' (скажем, mulInd), тогда подстрока перед mulInd будет мантисса (a1).
- Найдите индекс '^', скажем, powInd , тогда подстрока после powInd будет показателем степени (b1).
- Аналогично найдите a2 и b2.
- если(a1 > 0 && a2 < 0) , выведите M ( M всегда будет меньше).
- Точно так же, если (a2 > 0 && a1 < 0) , выведите N .
- иначе нужно будет использовать журнал для сравнения.
- Следующая формула будет использоваться для расчета журнала и получения результата, который будет сравниваться, чтобы определить, какое число больше.
N = a1 * 10 ^ b1
Taking log base 10 both side
log N = log(a1) + b1 ———-(1)
Similarly, log(M) = log(a2) + b2 ———(2)
Subtract equation (1) from equation (2)
ans = (2) – (1)
ans = log(a1/a2) + b1 – b2Therefore: int ans = log(a1/a2) + b1 – b2
- если a1 < 0 , то ans = -ans . Это потому, что и a1, и a2 оба отрицательны.
- если ans < 0 , выведите N.
- иначе, если ans > 0 , выведите M.
- иначе напечатайте Равно.
Ниже приведена программа на Java для реализации описанного выше подхода:
Выход:
Equal
M
N
Equal
Временная сложность: O ( 1 )
Согласно заданным ограничениям |a| может состоять максимум из 10 длин строки, а если оно отрицательное, то оно может иметь 11 длин, аналогично b также может состоять из 11 цифр. Максимальная длина строки может быть 25 (11 +3+11), поэтому мы можем рассмотреть возможность извлечения a и b операции с постоянным временем.
Вспомогательное пространство: O ( 1 )