N-я степень m для больших чисел

Во входном файле будет два числа в диапазоне 1 ≤ n, m ‹ 100. Я должен отобразить m в степени n. Когда я использую функцию pow(x,y), она не может вычислить большие целые числа для ex ::: 12 в степени 23, обычно должно отображаться 6624737266949237011120128, но мой код отображает отрицательное число. Кто-нибудь может решить это упражнение?


person Anonymous    schedule 13.04.2014    source источник
comment
покажите, что вы пробовали до сих пор, и другие будут более охотно помогать.   -  person James King    schedule 13.04.2014


Ответы (3)


Это не очень сложно сделать без использования внешних библиотек. Сохраните цифры числа в векторе и умножьте цифру на цифру (как вы делаете это на бумаге).

Example:

power(12,23):

Store as start->1->2->end

step 1 result: start->1->4->4->end
step 2 result: start->1->7->2->8->end

and so on...
person Rikayan Bandyopadhyay    schedule 13.04.2014
comment
Но как я могу использовать вектор, чтобы показать эти цифры? - person Anonymous; 13.04.2014
comment
Итерируйте вектор, чтобы напечатать их. См. пример по этой ссылке. - person Rikayan Bandyopadhyay; 13.04.2014
comment
я прочитал эту ссылку, но я не мог понять, как использовать ее в своем упражнении... можете ли вы написать здесь решение этого упражнения, пожалуйста? - person Anonymous; 13.04.2014
comment
Мы в stackoverflow не можем писать для вас коды. Попробуйте понять проблему из ответа и по данной ссылке. Также попробуйте поискать в сети. Если вы чувствуете, что у вас другая проблема, задайте другой вопрос. - person Rikayan Bandyopadhyay; 13.04.2014

Можете ли вы показать исходный код? Для сохранения результата достаточно использовать double. Ниже приведен мой тестовый код для справки:

#include <iostream>
#include <cmath>

using namespace std;

int main (int argc, char *argv[])
{
    double result = pow (12, 23);
    cout.precision (26);
    cout << "Result: " << result << endl;
}
person YS Wang    schedule 13.04.2014
comment
Результат выполнения: 6624737266949237011120128 - person YS Wang; 13.04.2014
comment
Или попробуйте вызвать функцию powl: long double powl(long double x, long double y); - person YS Wang; 13.04.2014
comment
но он все еще дает неправильный ответ, когда я пытаюсь найти для ex 99 мощность 99 - person Anonymous; 13.04.2014
comment
99^99, я получил ответ 3,6972963764972680219298523e+197, не так ли? - person YS Wang; 13.04.2014
comment
Google показывает тот же результат, ссылка - person YS Wang; 13.04.2014
comment
Нет, это неверно, либо bc, либо даже python2 выводят другой результат: 369729637649726772[...], тогда как C++ выводит 369729637649726802[...]. - person Chnossos; 13.04.2014

Попробуйте сохранить свою базу в long double перед вызовом pow :

long double base = 12;
long double result = pow(base, 23);

Однако это не требуется, начиная с C++11, вы можете получить хорошее приближение, как это:

#include <iomanip>
#include <iostream>
#include <cmath>

int main ()
{
    std::cout << std::fixed << std::setprecision(0) << pow(99, 99) << std::endl;
}

Выход :

369729637649726802192985226395427290145296428445515959701359650120802601667133273280053721002700400354392780458116125965728631706472588849812738072765460822138161108630185181415759762204338929270784

Но это приблизительно, например, Python2 код print 99 ** 99 выводит это:

369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899

Чтобы получить точный результат на C++, вам следует взглянуть на некоторые библиотеки BigInt.

person Chnossos    schedule 13.04.2014
comment
C++ по умолчанию не обрабатывает бесконечные числа, вам следует обратиться к какой-нибудь библиотеке BigInt. - person Chnossos; 13.04.2014