• ベストアンサー

c言語で大きな値の階数を求めたいのですが

c言語で関数を用いてn!を求めるプログラムを作ったのですが、 nの値が大きくなると0という値になってしまって正しい値が出てきません。 プログラムをどの様に修正したらきちんとnの値が大きくなっても 正しく値が表示されるでしょうか? ソースはこちらです。 #include <stdio.h> int func(int i); int func(int i){ if(i == 0) return 1; else return (i*func(i-1)); } void main(){ printf("%d",func(90)); /*90!を求める*/ } よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

#1です。念のため。 90の階乗 => 139桁 多くのコンパイラで、 int => 約9桁 long int => 約18桁 double => 有効数値は約15桁。大きい数は約308桁(16桁目以降は不正確) これ以上の有効桁数を扱うときは、先に書いたように、多倍長演算ライブラリを使う必要があります。

riba777
質問者

お礼

度々ありがとうございます。 プログラムの基礎を知らないと少々厳しかったですね。 この様なライブラリが存在していたとは知らなかったので 大変助かりました。

その他の回答 (2)

  • 5S6
  • ベストアンサー率29% (675/2291)
回答No.2

#include <stdio.h> long func(long i); long func(long i){ if(i == 0) return 1; else return (i*func(i-1)); } void main(){ printf("%ld",func(90)); /*90!を求める*/ } intの範囲を超えたからじゃないの? コンパイラによりintの範囲が違います。 64bitだと範囲が広がります int ->long $d -> %ld

riba777
質問者

お礼

改善ありがとうございます。 もう一度int系列の特性などを見直そうと思います。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

int つまり整数型で扱える数は、最大でも2の31乗とか63乗とかです。 それより大きい数を扱うには、多倍長演算ライブラリというのを使います。検索して調べて見てください。 正確な値でなくてもいいなら、double型を使うと計算できます。doubleでも有効数値は15桁くらいなので、それ以上の桁は不正確です。

関連するQ&A