-1

私はハッカーアース競争のための次のコードを持っており、C++ (g++ 4.8.4) で書かれており、実行時に SIGFPE を与えています。

それを修正する方法を教えてください

    #include<iostream>
    using namespace std;
    int factorial(int n);
   int main()
  {
   int n , k ,totitem , totways=0 , har1,har2, ansh=1;
int res;
cin>>n>>k;
totitem = (n/k);

ansh=factorial(n);

if(totitem>0)
for(int i=0;i<=totitem*k;i+=k)
{
    har1=factorial(i);
    har2=factorial(n-i);
    totways+=(ansh/(har1*har2));
}

cout<<totways;

return 0;
}
int factorial(int n)
{
if(n>1)
 return n*factorial(n-1);
 else
// if(n==0 || n==1)
 return 1;
}
4

1 に答える 1

1

通常、ゼロ除算のエラーです。

コードには 2 つの除算ステートメントがあります。

1:

totitem = (n/k);

入力をサニタイズしない場所。

2:

har1=factorial(i);
har2=factorial(n-i);
totways+=(ansh/(har1*har2));

har パラメータのいずれかがゼロに等しい場合、これは失敗します。

この問題の原因として最も可能性が高いのは、32 ビットの符号付き整数 (int) を使用して階乗計算を行っていることです。これは 12 の階乗に制限されています! より大きな数値で階乗を実行しようとすると、オーバーフローが発生し、結果が不正確になり、最終的にゼロ値になり、ランタイム エラーが発生します。

于 2016-08-28T00:42:59.607 に答える