0

こんにちは皆さん、コードに別の問題があるため、投稿を編集しました。昨日階乗関数に問題がありましたが、あなたの回答のおかげでなんとか解決できました。それはばかげた間違いでした。問題は、15より大きい値の場合、最終結果(個々の数値の階乗ではない)が常に0または-1であり、小さい値の場合は正常に機能することです。誰かがこのコードの何が問題になっているのか教えてもらえますか?

    #include <iostream>
    #include<time.h>

    using namespace std;



    int factorial(int a){
    if(a==1)
      return 1;
    else if(a==0)
      return 1;
    else 
      return factorial(a-1)*a;

    }

    int main(){
    std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
    std::cout.precision(5);
    int n,k;
    int x,y,z,w,v; 


    cout<<"give n : ";
    cin>>n;


     cout<<"give k : ";
     cin>>k;

     clock_t t;

        t = clock();



      if(n>=k&&k>1){

       x=factorial(n-1);
       y=factorial(k-1);
       z=factorial(n-1-k);
       w=factorial(n-k);
       v=factorial(k);


         cout<<"Result is "<<(x/(v*z))+(x/(y*w))<<endl;
       }
       else if (n==0||n==k)
         cout<<"Result is  1"<<endl;
       else
         cout<<"Result is  0"<<endl;


       t = clock() - t;
       cout<<"It took "<<t<<" clicks  ("<<((float)t)/CLOCKS_PER_SEC<<" seconds )"<<endl;    



       return 0;
       }
4

2 に答える 2

3

Integer overflow.

If int is 32 bits on your system, the largest value it can represent is 2147483647. 13 factorial is 6227020800.

If you use a 64-bit integer type such a long long, you can go up to 20 factorial.

Floating-point will give you more range, but with a loss of precision.

If you really need to compute large factorials, you'll need to use some multi-precision library like GMP, or use a language that has built-in arbitrary-precision integer arithmetic (C doesn't).

于 2013-03-03T18:44:12.943 に答える
1

factorial以下は、ゼロまたは負の引数で呼び出す場合があります。

z=factorial(n-1-k);
w=factorial(n-k);

factorial関数がクラッシュすることなくそのような引数を処理できることを確認する必要があります(そうではないと思います)。

于 2013-03-02T20:03:39.830 に答える