terminate called after throwing an instance of 'std::out_of_range' what(): stoll

void decimal_to(int64_t &number, int system_calculus);
int main(){
    int64_t A,B;
    int64_t formul_AB;
    std::cin >> A >> B;
    decimal_to(A, 4);
    decimal_to(B, 7);
    formul_AB = pow(B, 3) - pow(B, 2) + 2 * A;
    std::cout << formul_AB << std::endl;
    decimal_to(formul_AB, 2);
}
void decimal_to(int64_t &number, int system_calculus){
    if(number == 0){
        std::cout << 0;
    }
    std::string string_num = "";
    while(number > 0){
        int64_t new_num = number % system_calculus;
        string_num += std::to_string(new_num);
        number /= system_calculus;
    }

    std::reverse(string_num.begin(),string_num.end());
    number = std::stoll(string_num);
    std::cout << number << std::endl;
}

Это программа для перевода числа в разные исчисления. Выдается такая ошибка

terminate called after throwing an instance of 'std::out_of_range'
  what():  stoll

Ответы (1 шт):

Автор решения: Harry

Для тех, кто собирается и на работе не писать самому, а спрашивать коллег, во избежание будущего мордобития показываю азы отладки даже без отладчика.

Итак, проблема в stoll. Значит, добавляем строчку

std::reverse(string_num.begin(),string_num.end());
cout << "string_num = " << string_num << endl;
number = std::stoll(string_num);

чтоб посмотреть, а что мы ей передаем. Получаем для введенных 123 456

string_num = 1323
1323
string_num = 1221
1221
1818828666
string_num = 1101100011010010001111101111010

Читаем о том, что делает stoll — оказывается, она без аргументов основания счисления выдает число, рассматривая строку как десятичную запись. Конечно, есть еще один параметр — для выяснения количества обработанных цифр, но какой же уважающий себя кулхацкер будет опускаться до такого...

Итак, передаем 31-значное число. А какой размер long long, напомните? до примерно 19 знаков, и то не всех :)

Всё понятно?

И умоляю — опять же, во имя избежание виртуального мордобития :) — не спрашивайте "и как мне теперь это решить?"...

→ Ссылка