c言語のm個の中からn個を選ぶ際の『場合の数』(順列組み合わせ)mCnは以下の式で計算することができる(ただし、m>=n)
m!
mCn=ーーーー
n!(m−n)!
この公式を利用して、キーボードから入力したm、nの値に対する順列組み合わせを計算するプログラムを作成したい、以下に示すのがそのプログラムの一部である、なおプログラム作成に当たっては、引数として渡したint型変数の階乗をint型の戻り値として返す関数(関数名 fc)を作成し、これをmain関数中で3回呼び出すようにした、関数fc()の部分を考えてプログラムを作成お願いします
c言語始めたばかりで関数fc部分だけがわからないです。おしえてくださいお願いします
nの階乗n!の定義は以下の通りです
n!=1×2×3×、、、×(n−1)×n
#include<stdio.h>
#include<math.h>
関数fc()の記述部分
int main()
{
int m,n;
printf(”m=”);
scanf(”%d”,&m);
printf(”n=”);
scanf(”%d”,&n);
printf(”%dC%d=”,m,n);
printf(”%dY=n”,fc(m)/(fc(m−n)×fc(n)));
return(0);
関数fc
Re: 関数fc
C言語初心者なので,負の数の階乗とかどうすればいいのかわかりませんが,とりあえず書いてみました.
fnの引数が 1~そこそこ小さい値 なら動くかもしれません.
addとmulについては
http://dixq.net/forum/viewtopic.php?f=3&t=19319
にて改善案が示されていますので,参考にすると良いかもしれません.
fnの引数が 1~そこそこ小さい値 なら動くかもしれません.
int add( int a, int b )
{
int i;
int d = ( b>0 ? 1 : -1 );
int n = ( b>0 ? b : -b );
for( i=0; i<n; ++i )
{ a += d; }
return a;
}
int mul( int a, int b )
{
int i;
int r = 0;
int n = ( b>0 ? b : -b );
for( i=0; i<n; ++i )
{ r = add( r, a ); }
return ( b>0 ? r : -r );
}
int fn( int kitten )
{
return ( kitten>1 ? mul( kitten, fn(kitten-1) ) : 1 );
}
http://dixq.net/forum/viewtopic.php?f=3&t=19319
にて改善案が示されていますので,参考にすると良いかもしれません.
- purin52002
- 記事: 235
- 登録日時: 8年前
- 連絡を取る:
Re: 関数fc
こんにちは
1.階乗を計算する方法はわかりますか?(って質問文の中に階乗の定義は書いてありますね^^;)
階乗は1~nまでをかけ合わせたものになります。
手っ取り早く計算するには、forループを使うといいと思います。
2.forループの使い方はわかりますか?
計算はforループの中で掛け算をしていくだけです。
3.どういう計算式を書けばいいかはわかりますか?
計算さえできてしまえば後はもう関数にまとめてしまうだけです。
4.関数の作り方はわかりますか?
以上、4つのうちどこまでわかってどこまでわからないのか教えてもらってもいいですか?
最初から教えていくのはめんどくさいので(めんどくさがりなんです^p^)
1.階乗を計算する方法はわかりますか?(って質問文の中に階乗の定義は書いてありますね^^;)
階乗は1~nまでをかけ合わせたものになります。
手っ取り早く計算するには、forループを使うといいと思います。
2.forループの使い方はわかりますか?
計算はforループの中で掛け算をしていくだけです。
3.どういう計算式を書けばいいかはわかりますか?
計算さえできてしまえば後はもう関数にまとめてしまうだけです。
4.関数の作り方はわかりますか?
以上、4つのうちどこまでわかってどこまでわからないのか教えてもらってもいいですか?
最初から教えていくのはめんどくさいので(めんどくさがりなんです^p^)
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^