Я пытаюсь ввести число n и получить наименее супер счастливое число, которое больше или равно n.
Супер везение: его десятичное представление содержит одинаковое количество цифр 4 и 7. Например, числа 47, 7744, 474477 — супер везение, а 4, 744, 467 — нет.
Вот мой код
#include<iostream>
#include<string>
using namespace std;
void superLucky(int n,string s, int count4, int count7)
{
if (s.size() > 10)
return;
if (( stoi(s) >= n ) && (count4 == count7) && (count4+count7)!=0)
{
cout << s << endl;
return;
}
superLucky(n, s + '4', count4+1, count7);
superLucky(n, s + '7',count4,count7+1);
}
int main()
{
int n;
cin >> n;
superLucky(n, "", 0, 0);
return 0;
}
После ввода целого числа я получаю отладочную ошибку R6010 — вызвана abort (). Что это значит ? и как я могу это исправить?
Есть пара вопросов:
Когда вы звоните superLucky
от main
, s
пустой. stoi(s)
выдает исключение, когда s
пустой.
Чек s.size() > 10
не крепкий Это зависит от платформы. Вы можете использовать try/catch
блок, чтобы иметь дело с этим вместо жесткого кодирования размера.
Вот более надежная версия функции.
void superLucky(int n,string s, int count4, int count7)
{
int d = 0;
if ( s.size() > 0 )
{
try
{
d = stoi(s);
}
catch (...)
{
return;
}
if (( d >= n ) && (count4 == count7) && (count4+count7)!=0)
{
cout << s << endl;
return;
}
}
superLucky(n, s + '7',count4,count7+1);
superLucky(n, s + '4', count4+1, count7);
}
Это наверное потому что stoi()
бросили invalid_argument
исключение.
По первому звонку superLucky
, вы передаете пустую строку std::stoi
, Когда не удается выполнить преобразование, stoi
бросает исключение. Это исключение не пойман, поэтому uncaught_exception
вызывается, что в свою очередь вызывает abort