Матч
236, Массивные числа (MassiveNumbers)
Дивизион 2, Уровень
1
Число назовем массивным, если оно
записано в виде a^n, что означает возведение числа a, в степень n. В задаче требуется сравнить два массивных числа ab и cd, записанных в формате “<основание>^<экспонента>”.
Считается, что ab < cd, если b * log(a) < d * log(c), где логарифм берется по любому допустимому основанию. Из
заданных двух массивных чисел следует вернуть большее.
Класс: MassiveNumbers
Метод: string
getLargest(string numberA, string numberB)
Ограничения: numberA и numberB содержат от 3 до 9 символов,
имеют формат “<основание>^<экспонента>”, где 1 £ <основание>,
<экспонента> £
1000.
Вход. Два массивных числа numberA и numberB в формате
“<основание>^<экспонента>”.
Выход. Большее число среди numberA
и numberB.
Пример входа
numberA |
numberB |
"3^100" |
"2^150" |
"1^1000" |
"2^1" |
"893^605" |
"396^906" |
Пример выхода
"3^100"
"2^1"
"396^906"
РЕШЕНИЕ
элементарные вычисления
При помощи функции sscanf
считываем основание и экспоненту каждого числа. Используя функцию log,
сравниваем числа как описано в условии задачи. Возвращаем большее число.
ПРОГРАММА
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
class MassiveNumbers
{
public:
string getLargest(string numberA, string numberB)
{
int a, n, b, m;
sscanf(numberA.c_str(),"%d^%d",&a,&n);
sscanf(numberB.c_str(),"%d^%d",&b,&m);
return (n * log(1.0 * a) < m *
log(1.0 * b)) ? numberB : numberA;
}
};