• 締切済み

nCrの値が表示されない

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

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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 型が利用できない場合が  ありますので注意して下さい。 ・以上。

noname#103047
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

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

  • shred
  • ベストアンサー率35% (25/70)
回答No.1

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

関連するQ&A

専門家に質問してみよう