• ベストアンサー

桁あふれ誤差のプログラムで質問です。

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を使って)して行いたいのですが、 分からなくて本当に困っています。助けてください。

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

qngo11
質問者

お礼

ありがとうございました。おかげで疑問が解決できました。分かりやすい回答を本当にどうもありがとうございました。

その他の回答 (3)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

No.1さんの関数は、STARTの値が1でない場合に階乗の計算にならないのでは? 質問者さんの意図は、たとえばSTARTが3、ENDが5だったら 3!=6 4!=24 5!=120 と出力することだと思ったのですが。

qngo11
質問者

お礼

おっしゃるような結果が出せるようにしたいのです。ご意見ありがとうございます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

元のプログラムを利用して関数化だけ 引数に正の整数を渡すとその階乗が返る関数です 負の数や0を渡すと1が返ります int factorial(int num) { int n; int ans=1; for(n=1;n<=num;n++) { ans=ans*n; } return ans; }

qngo11
質問者

お礼

私が知らないやり方だったので、とても参考になりました。ありがとうございました。

  • nitho_t
  • ベストアンサー率49% (44/89)
回答No.1

動かすどころかコンパイルも通していないので自分で変更してください。 #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; } こんな感じでいかがでしょう。 前提条件としては自然数のみ。桁あふれに対処していない。環境と設定によってはスタックがあふれる。ぐらいかな?

qngo11
質問者

お礼

ありがとうございました。本当に助かりました。

関連するQ&A