C言語でnCr(組み合わせ)とnPr(順列)を求めるプログラム
Cプログラミングにおいて、nCrは組み合わせ(combination)と呼ばれます。nCrとは、n個の要素からなる集合からr個の要素を選び出す方法の数を指し、このとき選ぶ順序は考慮されません。
一方、nPrは順列(permutation)と呼ばれます。nPrとは、n個の要素からなる集合からr個の要素を取り出し、順序や並び方を考慮して配置する方法の数です。
順列・組み合わせの公式
C言語で与えられた数値の順列と組み合わせを求めるための公式は、以下の通りです。
- nCr = n! / (r! × (n-r)!)
- nPr = n! / (n-r)!
nCrを求める際のロジックは次のようになります。
result = factorial(n)/(factorial(r)*factorial(n-r));
nPrを求める際のロジックは次のようになります。
result = factorial(n)/factorial(n-r);
ここで使用されるfactorial()は、引数として受け取った整数の階乗(n!)を計算して返す関数です。階乗とは、1からその数までのすべての正の整数を掛け合わせた値のことです。
サンプルコード
以下は、入力された数値の順列と組み合わせを求めるCプログラムの例です。
#include <stdio.h>
long factorial(int);
long find_ncr(int, int);
long find_npr(int, int);
int main(){
int n, r;
long ncr, npr;
printf("Enter the value of n and r\n");
scanf("%d%d",&n,&r);
ncr = find_ncr(n, r);
npr = find_npr(n, r);
printf("%dC%d = %ld\n", n, r, ncr);
printf("%dP%d = %ld\n", n, r, npr);
return 0;
}
long find_ncr(int n, int r) {
long result;
result = factorial(n)/(factorial(r)*factorial(n-r));
return result;
}
long find_npr(int n, int r) {
long result;
result = factorial(n)/factorial(n-r);
return result;
}
long factorial(int n) {
int c;
long result = 1;
for (c = 1; c <= n; c++)
result = result*c;
return result;
}このプログラムでは、main()関数内でユーザーからnとrの値を入力として受け取り、find_ncr()関数とfind_npr()関数をそれぞれ呼び出して結果を表示します。各関数内部では、factorial()関数を使って階乗を計算し、先述の公式に基づいてnCrおよびnPrを求めています。
実行結果
上記のプログラムをコンパイルして実行すると、次のような出力が得られます。
Enter the value of n and r 5 2 5C2 = 10 5P2 = 20
この例では、5個の中から2個を選ぶ場合、組み合わせ(5C2)は10通り、順列(5P2)は20通りとなります。順列の方が組み合わせより常に大きい(または等しい)のは、順序の違いを別々の並び方として数えるためです。
-
Javaで商と余りを求めるプログラムの書き方
Javaで割り算の商と余りを求める方法を解説します。以下のサンプルコードをご覧ください。サンプルコードpublic class Demo{ public static void main(String[] args){ int my_dividend = 11, my_divisor = 7; int my_quotient = my_dividend / my_divisor; int my_remainder = my_dividend % my_divisor; System.out.println(The valu
-
Pythonでi個のx、j個のy、k個のzからなる部分列の個数を求めるプログラム
文字列 s が「x」「y」「z」で構成されているとします。このとき、「x」が i 個(i ≥ 1)、その後に「y」が j 個(j ≥ 1)、さらにその後に「z」が k 個(k ≥ 1)という順序で並ぶ部分列の総数を求めます。 例えば、入力が s = xxyz の場合、出力は 3 になります。これは xyz を2通りと xxyz を1通りの合計3通り作れるためです。 解き方のアプローチ この問題は動的計画法(DP)の考え方を使うと効率的に解けます。文字列を先頭から順に走査しながら、次の3つのカウンターを更新していきます。 x: それまでに見つかった「xのみで構成される部分列」の個数 y: そ