0

私はデバッガーとキャッチアンドスローを試しましたが、どちらにも慣れていないことを告白します。しかし、プログラムで浮動小数点例外の原因を見つけることができません。奇妙なことに、35未満の数値に対して完全に実行されます。それを超えると、例外が発生します。問題はどこにありますか?

int fibo(int n)
{   if(n==0 || n==1)
        return 1;
    int p=1;
    while(n>1)
        p*=(n--);
    return p;
}

int main()
{   int T;
    int N, M;
    cin>>T;
    for(int i=0; i<T; i++)
    {
        cin>>N>>M;
        int cnt=1;
        int ones=N, twos=0;
        if(ones==1 && M==1)
        {   cout<<"CORRECT"<<endl;
            continue;
        }
        else if(ones==1 && M!=1)
        {   cout<<"INCORRECT"<<endl;
            continue;
        }

        while(ones>=2)
        {   
            ones-=2;
            twos++;
            cnt+= fibo(ones+twos)/( fibo(ones) * fibo(twos) );
        }
        cout<<cnt<<endl;
        int tmp=0;
        while(cnt>0)
        {   if(cnt%2 == 1)
                tmp++;
            cnt/=2;
        }
        if(  tmp==M  )
            cout<<"CORRECT"<<endl;
        else
            cout<<"INCORRECT"<<endl;
    }

    system("pause");
    return 0;
}

どうもありがとう。

4

1 に答える 1

1

「浮動小数点例外」は C++ 例外ではありません。tryそしてcatchあなたを助けません。残念な用語ですが、OS に由来するもので、「クラッシュ」のようなものです。

さらに困惑するのは、ゼロによる整数除算を実行しようとすると、一部のプラットフォームで見られることです。私はあなたのコードを解明していませんが、多くのデバッグ出力を追加し、変数の値を追跡し、ゼロで除算している場所を見つけます。:)

候補であることがわかる唯一の場所は次のとおりです。

cnt+= fibo(ones+twos)/( fibo(ones) * fibo(twos) )
//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
于 2013-02-02T06:55:02.733 に答える