私は数字を入力しようとしています、nとn以上の最もラッキーな数字を取得します。スーパーラッキー:10進数表現には、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
が呼び出されます