プロが教えるわが家の防犯対策術!

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

よろしくお願いします。

A 回答 (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』をどうぞ。今後、いろいろと活用できるはずです。

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/in …
    • good
    • 0
この回答へのお礼

とても分かりやすく参考になりました。

お礼日時:2007/05/11 07:19

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 は全然わからない」と言ってますが, そこはニュアンスとかイメージとか勘でなんとかする.
    • good
    • 0
この回答へのお礼

なんとなくイメージがわいてきました。

お礼日時:2007/05/11 07:20

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