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 шт):
Для тех, кто собирается и на работе не писать самому, а спрашивать коллег, во избежание будущего мордобития показываю азы отладки даже без отладчика.
Итак, проблема в 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 знаков, и то не всех :)
Всё понятно?
И умоляю — опять же, во имя избежание виртуального мордобития :) — не спрашивайте "и как мне теперь это решить?"...