- ベストアンサー
C#でmCnの求め方について 階乗、組み合わせ
C#の勉強を始めて数日の初心者です。 8個の中から4個を選ぶ組み合わせ 式1 m! mCn = ―――― n!(m -n)! 式2 m×(m-1)×(m-2)×…×(n+1) mCn = ―――――――――――― (m-n)! ---------------------------------------------- 勉強している本の中で、VBSctiptで式2を下記のような 記述例がありましたが、これをC#で書き換えると どのようになりますか? VBScriptの内容は全然分かりません。 メソッドの再帰呼び出し等は使わず、 あくまで、For文のみを使ってC#で記述したいです。 m = CInt(InputBox("何個の中から?")) n = CInt(InputBox("何個を選びますか?")) C = 1 For i = m To (n + 1) Step -1 c = c * i Next For i = (m - n) To 1 Step -1 c = c / i Next MsgBox "組み合わせ = " & CStr(c) ---------------------------------------------- 8個の中から4個を選ぶ組み合わせ 自分で書いてみたのですが、上記の式2のVBScriptの例に のっとった記述方法ではない感じがします。 int m = 8; int n = 4; int c = 0; for (int i = 1; i <= m; i++) { c = c * m; // mの階乗を求める } for (int i = 1; i <= n; i++) { d = d * n; // nの階乗を求める } e = d * d; // これの意味がよく分かりません。 f = c / e; Console.WriteLine(f); // 70 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★もっとスマートに考えれば良いんじゃないの? ・つまり、8C4の場合は 8 の階乗を mm、4 の階乗を nn とします。 その後に『式1』を使って求めます。→m - n を o に代入します。 ・下にそのサンプルを載せます。 サンプル: int mm = 1, m = 8; int nn = 1, n = 4; int oo = 1, o = (m - n); for ( int i = 1 ; i <= m ; i++ ){ ←8 の階乗 mm *= i; } for ( int i = 1 ; i <= n ; i++ ){ ←4 の階乗 nn *= i; } for ( int i = 1 ; i <= o ; i++ ){ ←(m - n) の階乗 oo *= i; } int ans = (m / (n * o)); ←式1より Console.WriteLine( ans ); // 70 その他: ・再帰呼び出しを行わないならば、単純にループして階乗を求めればよい。 上記では 8、4、(m -n) の階乗をそれぞれ for 文で計算していますが、関数などにでもして 階乗を簡単に求められるようにすれば良いかもね。階乗の計算結果を戻り値に戻す仕組みで。 ・あまり、難しく考えずに人間が考えている方法を C# の文法に則って記述すれば良いだけ。 ・以上。参考に。→下の『参考URL』をどうぞ。今後、いろいろと活用できるはずです。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
VBScript の前半部分を何も考えずに C# に変換すると for (int i = m; i >= n+1; i = i-1) { c = c*i; } もうちょっと C# っぽく書くと for (int i = m; i > n; --i) { c *= i; } 「VBScript は全然わからない」と言ってますが, そこはニュアンスとかイメージとか勘でなんとかする.
お礼
なんとなくイメージがわいてきました。
お礼
とても分かりやすく参考になりました。