重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/26 17:18

No.1さんの関数は、STARTの値が1でない場合に階乗の計算にならないのでは?


質問者さんの意図は、たとえばSTARTが3、ENDが5だったら
3!=6
4!=24
5!=120
と出力することだと思ったのですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/26 17:20

元のプログラムを利用して関数化だけ


引数に正の整数を渡すとその階乗が返る関数です
負の数や0を渡すと1が返ります
int factorial(int num)
{
int n;
int ans=1;
for(n=1;n<=num;n++)
{
ans=ans*n;
}
return ans;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/26 17:16

動かすどころかコンパイルも通していないので自分で変更してください。



#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;
}

こんな感じでいかがでしょう。
前提条件としては自然数のみ。桁あふれに対処していない。環境と設定によってはスタックがあふれる。ぐらいかな?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/26 17:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!