
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を使って)して行いたいのですが、
分からなくて本当に困っています。助けてください。
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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
No.3
- 回答日時:
No.1さんの関数は、STARTの値が1でない場合に階乗の計算にならないのでは?
質問者さんの意図は、たとえばSTARTが3、ENDが5だったら
3!=6
4!=24
5!=120
と出力することだと思ったのですが。
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;
}
こんな感じでいかがでしょう。
前提条件としては自然数のみ。桁あふれに対処していない。環境と設定によってはスタックがあふれる。ぐらいかな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での奇数の和
-
Haskellで関数を合成しようとす...
-
式は定数値が必要です」という...
-
C言語での引数の省略方法
-
未解決の外部シンボル _printf...
-
CStringの配列要素を関数で受け...
-
「指定されたキャストは有効で...
-
return 1L
-
複数桁10進数の*桁目だけを抽出...
-
任意の文字列のアルファベット...
-
入力された数字を大きい順に並...
-
C言語のプログラム作成について
-
【C++】行列データの読み込み
-
2次元配列とポインタの引数受け...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
return 1L
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
式は定数値が必要です」という...
-
数字列を3桁ごとにカンマで区切...
-
実数の整数部,小数部の取得
-
C言語でDxlibを使って3x3の奇数...
-
プログラムについて(UNIX)
-
acceptをalarmでタイムアウトさ...
-
C言語の課題です
-
エラー 添字が付けられた値が、...
-
CStringの配列要素を関数で受け...
-
最早開始時間と最遅完了時刻を...
-
入力された数字を大きい順に並...
おすすめ情報