0

二項係数を計算するコードがありますが、数値が20より大きい場合、計算が間違ってしまいます。どこに問題がありますか?ありがとう

#include <iostream>
using namespace std;

long int bin(long int x)
{
    if(x==0)
        return 1;
    long int r = x;
    for(int i = r-1;i>0;i--)
    {
        r = r*i;
    }
    return r;
}
int main()
{
    cout << "Write n and k: " << endl;
    long int n=0;
    long int k=0;
    cin >> n;
    cin >> k;
    long int result = 0;
    long int fn = bin(n);
    long int fk = bin(k);
    long int fnk = bin(n-k);


    result = fn/(fk*fnk);

    cout << endl << "C = " << result << endl;


    return 0;
}

たとえば、12と5 = 792は正しいですが、20と4=-2は正しくありません

4

3 に答える 3

2

関数は階乗binを計算します。21 の階乗は a に収まりませんlong

すでに実装の詳細に依存しています。long必要なのは 32 ビットだけですが、システムでは 64 ビットです。32 ビットしかない場合は、すぐに失敗します。

于 2012-10-31T11:16:05.013 に答える
2

20!= 2432902008176640000 であり、long int保持できる値 (通常は 2147483647) をはるかに超えています。double代わりに使用してください。

于 2012-10-31T11:16:18.247 に答える
2

を使用してnの階乗を計算しています

bin(n);

n が >=20 の場合、long の制限を超えています。

@SteveJessop がコメントで指摘したように範囲が0 to 18446744073709551615

int-array を使用して結果を保存することができます。 詳細はこちら.

于 2012-10-31T11:17:03.360 に答える