Матч 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;

  }

};