Сравните два числа с плавающей запятой, заданные в научной нотации.

Опубликовано: 20 Сентября, 2022

Даны две строки N и M в виде a * 10 b . Задача состоит в том, чтобы сравнить данные два числа с плавающей запятой и вывести меньшее число , а если оба числа равны, то вывести равно.

 0<|a|<10^9  and  -10^9<b<10^9.

Пример:

N and M are two numbers with two parts:

  1. a1 is mantissa of N and a2 is mantissa of M.
  2. 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 – b2

Therefore: 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 )