そんな勝ち組のあなたに....
#include <stdio.h>
static __int64 tbl[] = {1, 1, 2, 6, 24, 120, 720, 5040,
40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200,
1307674368000, 20922789888000, 355687428096000,
6402373705728000, 6402373705728000, 2432902008176640000};
static __int64 factorial(__int64 n)
{
return tbl[n];
}
static __int64 combination(__int64 n, __int64 m)
{
return factorial(n) / factorial(m) / factorial(n - m);
}
int main(int argc, char* argv[])
{
__int64 n, m;
printf("組み合わせnCmを計算します。\n");
printf("nとmを入力してください(n>m)\n");
printf("n -->");
scanf("%lld", &n);
printf("m -->");
scanf("%lld", &m);
printf("異なる%lld個の整数から%lld個の整数を取り出す"
"組み合わせは%d通りです。\n", n, m,
combination(n, m));
return 0;
}
// ソースはここまで
>nの階乗を計算する関数factorial
作成した
>組み合わせを計算する関数combinationを作成し、
>関数combinationの中で関数factorialを使用して組み合わせを計算すること。
combinationの中でfactorialを使用している
よって、題意は完全に満たされている
文句のつけようがないはずだ。
事前にテーブルで計算してあるので
非常に高速というおまけつきである。
まさに、勝ち組にふさわしい回答ではないか!!!