いわゆるnCk
「色違いの5個のボールが袋に入っている。その袋から3つ取り出す場合の組み合わせの数を求めよ」
という中学数学に出てきそうな問題を解くためのやつ。
表記としては5C3と書く。
計算
5C3では次のようになる。
5C3 = (5×4×3)/(3×2×1) = 10
nCk = nCn-k なので、計算量が少ない方を選べばいい。
できたもの
/// <summary> /// 組み合わせの数を求める /// </summary> /// <param name="n">要素数</param> /// <param name="k">選ぶ数</param> /// <returns>nCk</returns> public BigInteger Count(long n, long k) { if (k > n - k) k = n - k; var numerator = new BigInteger(1); var denominator = new BigInteger(1); var tmp = 1L; for (int count = 1; count <= k; count++) { numerator *= n; n--; denominator *= tmp; tmp++; } return numerator / denominator; }
なんでおっさんはすぐBigIneger使うん?
答えがすぐに爆発するからやで。
Count(600, 25) = 110400461164029879580081326850533034570953024
こんなふうに、ちょっと大きい数字を与えただけでintの範囲を軽く超えてくる。
もうBigInteger使うしかないでしょ。