- 締切済み
エングセットの公式について(初心者です)
プログラム初心者です。 visual c++を現在使っていてエングセットの公式について下の式をc++で組み、0.751という値を出したいのですができません。 (20 C 3 )0.6^3 Pb = ---------------------- =0.751 3 Σ ( 20 C k ) 0.6^k k=0 Cというのはコンビネーションです。 どなたか教えてください。お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
#include <stdio.h> #include <math.h> int nCr(int n, int r) { int ncr, i, j; for (ncr = i = 1, j = n; i <= r; i++, j--) { ncr *= j, ncr /= i; } return ncr; } #include <stdio.h> int main(void) { double sum; int k; for (sum = k = 0; k <= 3; ++k) { sum += nCr(20, k) * pow(0.6, k); } printf("%f\n", nCr(20, 3) * pow(0.6, 3) / sum); return 0; }
またまた、#1です。 mCn={m×(m-1)×…×(m-n+1)}/{m×(m-1)×…×1} なので、例えば comb=1; for(i=20;i>=(m-n+1);i--){ comb *= i; } for(i=m;i>=1;i--){ comb /= i; } (mとnは設定済みとします。) で、計算できませんか? 計算の方法は色々有ります。こう書かなければいけないということは有りません。 但し、桁数がとても大きくなる可能性があるときは、変数の桁あふれに注意しましょうね。
お礼
ありがとうございます。 コンビネーションの考え方としてとても参考になりました。 こちらを参考にΣ等も含め、プログラミングしたいと思います。
#1です。 CとΣを計算するときは、自分で手で計算するときと同じようにします。 Cの計算は、計算式で表せますか?実際は、20の階乗を計算すると桁あふれを起こすかもしれませんから計算方法には注意が必要です。 階乗のように順番に掛け算をするときは、for文で回しましょう。 そして、Σを計算するときも0~3まで回してどんどん加算させればOKでしょう。 実際に自分の手で計算することが出来ないとプログラムにはしづらいですよ。
補足
Σについては簡単なものなら組んだこともありますしできると思います。 しかしCが計算式でも表せずって感じなので進められません。。 プログラムを良かったら教えていただけないでしょうか。
補足してください。 ・「できません」とは、何ができないの? (プログラムが組めない、数式が理解できない、数式をプログラムに変換できない…) ・自分では、何処まで出来ているの?
補足
ごめんなさい。補足です。 数式は理解できるのですが、プログラミングとなるとわからず組めません。 自分ではコンビネーションとシグマがわからず、プログラムに手を出せていない状況です。
お礼
全体のプログラムを作って頂いて本当にありがとうございます! とてもシンプルでわかりやすいですね。 こちらも是非参考にさせていただきたいと思います。