- ベストアンサー
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!を求める*/ } よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。念のため。 90の階乗 => 139桁 多くのコンパイラで、 int => 約9桁 long int => 約18桁 double => 有効数値は約15桁。大きい数は約308桁(16桁目以降は不正確) これ以上の有効桁数を扱うときは、先に書いたように、多倍長演算ライブラリを使う必要があります。
その他の回答 (2)
- 5S6
- ベストアンサー率29% (675/2291)
#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
お礼
改善ありがとうございます。 もう一度int系列の特性などを見直そうと思います。
- notnot
- ベストアンサー率47% (4900/10358)
int つまり整数型で扱える数は、最大でも2の31乗とか63乗とかです。 それより大きい数を扱うには、多倍長演算ライブラリというのを使います。検索して調べて見てください。 正確な値でなくてもいいなら、double型を使うと計算できます。doubleでも有効数値は15桁くらいなので、それ以上の桁は不正確です。
お礼
度々ありがとうございます。 プログラムの基礎を知らないと少々厳しかったですね。 この様なライブラリが存在していたとは知らなかったので 大変助かりました。