- 締切済み
nCrの値が表示されない
C言語でnCrの値を求めるプログラムをnCr=n!/(r!*(n-r)!)を元に、再帰を用いて階乗を求める関数を用いて作成したのですが、nとrがn=40,r=11等の大きな値になるとnCrの値をunsigned long intで定義していても値が表示されませんでした。桁あふれではないんですが何故でしょうか?PCの構造にそこまで詳しくないので、詳しい理由を教えてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★桁あふれ(オーバーフロー)しているはずです。 >PCの構造にそこまで詳しくないので、詳しい理由を教えてください。 ↑ C言語の基礎(int型の範囲)に関して詳しくないだけですよ。PCじゃない。 解決策: ・40の階乗を求めるのではなく『r』の次から『n』までの掛け算を行います。 そして『n-r』の階乗で割れば良いでしょう。 つまりnCr、n=40、r=11の計算を工夫します。 nCr=(12 * 13 * … * 40) / (40 - 11)! nCr=(12 * 13 * … * 40) / (1 * 2 * 3 * … * 11 * 12 * … * 29) nCr=(30 * 31 * … * 40) / (1 * 2 * 3 * … * 11) nCr=92279715720192000 / 39916800 nCr=2311801440 このようになります。 でも30~40を乗算すると 9.228×10^16乗となり unsigned long int 型でも計算不可能。 そこで unsigned long long int 型を使えば計算可能となります。 ただし、処理系によっては unsigned long long int 型が利用できない場合が ありますので注意して下さい。 ・以上。
お礼
最後の表示でunsigned long intの範囲で扱える値に収まっていればいいのではなくて、途中の計算値でもunsigned long intの範囲で扱える値を超えると オーバーフローになるんですね。 みなさん返事ありがとうございます。