コンビネーション(組合せ)nCrを計算するプログラムを作ったのですが、nとrが大きな値になると答えが合わなくなってしまいます。
↓ソースコード
//Microsoft Visual Studio Express 2015 Windows for Desktop
//Visual C++
#include<stdio.h>
#include<stdlib.h>
double combination(int, int);
int main(void) {
int n = 0, r = 0;
char str[8];
do { //n,rの入力、但し0<=r<=n
printf("n=");
fgets(str, sizeof(str), stdin);
n = atoi(str);
} while (n < 0);
do {
printf("r=");
fgets(str, sizeof(str), stdin);
r = atoi(str);
} while (n < r);
printf("%dC%d = %.0f\n", n, r, combination(n, r));
getchar();
return 0;
}
double combination(int n, int r) { //nCr の計算
int i;
double C = 1;
for (i = 0; i < r; i++) {
C *= n - i;
C /= i + 1;
}
return C;
}
(実際は 100891344545564193334812497256 なので、約9兆ほどズレてる。
他の場合も自分のPCで試した結果、nが60以下の時は問題無いが、nが61を超えると、rの値によっては答えがずれてしまう)
自分が思いつく限りのソースコードの修正をしてはみましたが、これ以上改善しませんでした・・・。
最終的にはnが100以下ならば絶対答えが合うようにしたいのですが、分かる方はアドバイスをお願いします。