- ベストアンサー
桁あふれ誤差のプログラムで質問です。
1から15までの階乗を計算するプログラムで、階乗を求める関数を定義してその結果を確認し、その際に階乗の計算を開始する数と終了する数を記号定数で定義(#defineを使って)したいのですが、分からなくて困っています。 関数を使わないで以下のようにやり、 #include <stdio.h> #include <math.h> int main(void) { int n; int ans=1; for(n=1;n<=15;n++) { ans=ans*n; printf("%d!=%d\n",n,ans); } return 0; } これをやってみてなんとか結果が確認できたのですが、上記のように、階乗を求める関数を定義して、この上記のプログラムを書き換えて、そのときに階乗の計算を開始する数と終了する数を記号定数で定義(#defineを使って)して行いたいのですが、 分からなくて本当に困っています。助けてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>桁あふれ・・ が質問主旨ですよね・・。 ある数の階乗計算途中で、「桁あふれ」によって、変数が「マイナス」になることを確認すればよいと思います・・。 13!で、int ではパンク。 >1から15までの階乗を計算するプログラムで、・・ >階乗の計算を開始する数と終了する数を記号定数で定義・・ 後から見て、プログラムの途中に、for(n=1;n<=15;n++){ が現れた場合、この1や15はなんじゃい? の疑問を解決するための「定義」、と軽く(枝葉末節?)解釈しました。 #include <stdio.h> #define HAJIME 1 #define OWARI 15 int Kaijyo( int iSeed ) { int iWork = iSeed - 1, iKai = iSeed; while( iWork ){ iKai *= iWork; if( iKai < 0 ){ // マイナスになった = 桁あふれ printf( "\n%d", iSeed ); iSeed--; while( iSeed >= iWork ){ printf( " X %d", iSeed ); iSeed--; } printf( " = %d\n", iKai ); return( 0 ); } iWork--; } return( iKai ); } int main( void ) { int i, iKai; for( i = HAJIME; i <= OWARI; i++ ){ iKai = Kaijyo( i ); printf( "%d! = %d\n", i, iKai ); } return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (3)
- salsberry
- ベストアンサー率69% (495/711)
No.1さんの関数は、STARTの値が1でない場合に階乗の計算にならないのでは? 質問者さんの意図は、たとえばSTARTが3、ENDが5だったら 3!=6 4!=24 5!=120 と出力することだと思ったのですが。
お礼
おっしゃるような結果が出せるようにしたいのです。ご意見ありがとうございます。
- php504
- ベストアンサー率42% (926/2160)
元のプログラムを利用して関数化だけ 引数に正の整数を渡すとその階乗が返る関数です 負の数や0を渡すと1が返ります int factorial(int num) { int n; int ans=1; for(n=1;n<=num;n++) { ans=ans*n; } return ans; }
お礼
私が知らないやり方だったので、とても参考になりました。ありがとうございました。
- nitho_t
- ベストアンサー率49% (44/89)
動かすどころかコンパイルも通していないので自分で変更してください。 #define START 1 #define END 15 f(int n) { if(END > n) { n = n * f(n+1); } return n; } int main() { int ans = f(START); return 0; } こんな感じでいかがでしょう。 前提条件としては自然数のみ。桁あふれに対処していない。環境と設定によってはスタックがあふれる。ぐらいかな?
お礼
ありがとうございました。本当に助かりました。
お礼
ありがとうございました。おかげで疑問が解決できました。分かりやすい回答を本当にどうもありがとうございました。