プロが教えるわが家の防犯対策術!

C言語でnCrの値を求めるプログラムをnCr=n!/(r!*(n-r)!)を元に、再帰を用いて階乗を求める関数を用いて作成したのですが、nとrがn=40,r=11等の大きな値になるとnCrの値をunsigned long intで定義していても値が表示されませんでした。桁あふれではないんですが何故でしょうか?PCの構造にそこまで詳しくないので、詳しい理由を教えてください。

A 回答 (3件)

★桁あふれ(オーバーフロー)しているはずです。


>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 型が利用できない場合が
 ありますので注意して下さい。
・以上。
    • good
    • 0
この回答へのお礼

最後の表示でunsigned long intの範囲で扱える値に収まっていればいいのではなくて、途中の計算値でもunsigned long intの範囲で扱える値を超えると
オーバーフローになるんですね。
みなさん返事ありがとうございます。

お礼日時:2008/02/01 12:01

> 桁あふれではない



間違いなくそうだと確認しましたか?
40の階乗はunsigned long int型で扱える範囲を超えますので、
計算の手順(先に40の階乗を求めようとする、など)によっては
桁あふれします。
    • good
    • 0

>値が表示されませんでした


何も表示されなかったんですか?
プログラムが明記されてないのでわかりませんが
答え自体は桁あふれしないと思いますが計算途中で
あふれてるとかはないですかね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!