C 言語で組み合わせ (nCr) を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラムを使用して組み合わせ (nCr) を計算する方法を学びます。この実験は、2 つの主要なステップで構成されています。まず、n と r の入力値を読み取り、次に、組み合わせ nCr = n! / (r! * (n-r)!) を計算するための式を実装します。この実験の終わりまでに、任意の n と r の値に対して組み合わせを計算できる動作する C プログラムを作成します。

この実験は、scanf() 関数を使用して n と r の入力値を読み取る方法を示すことから始まります。その後、最終結果を計算するために使用される階乗および組み合わせ計算関数の実装を紹介します。この実験では、完全なコードと手順を示すため、自分のプロジェクトで概念を適用しやすくしています。

n と r の読み込み

このステップでは、C プログラムで組み合わせを計算するために、n と r の入力値を読み取る方法を学びます。

まず、組み合わせ計算プログラム用の新しい C ファイルを作成します。

cd ~/project
nano combinations.c

次に、入力値を読み取る以下のコードを追加します。

#include <stdio.h>

int main() {
    int n, r;

    // ユーザーに n と r の値を入力するよう促す
    printf("Enter the value of n: ");
    scanf("%d", &n);

    printf("Enter the value of r: ");
    scanf("%d", &r);

    // 入力値を出力して、入力が正しいことを確認する
    printf("You entered n = %d and r = %d\n", n, r);

    return 0;
}

コンパイルしてプログラムを実行し、入力をテストします。

gcc combinations.c -o combinations
./combinations

出力例:

Enter the value of n: 5
Enter the value of r: 3
You entered n = 5 and r = 3

このコードは、以下の方法を示しています。

  • scanf() を使用してユーザーからの整数入力を取得する
  • ユーザーに n と r の値を入力するよう促す
  • 入力された値を出力して、正しい入力が行われたことを確認する

このコードは、必要な入力値 n と r を最初に取得することで、組み合わせの計算のための基礎を築きます。

nCr = n!/(r!(n-r)!) の計算

このステップでは、階乗を計算する関数を実装し、nCr = n! / (r! * (n-r)!) の公式を使用して組み合わせを計算します。

以前の combinations.c ファイルを開き、階乗と組み合わせ計算関数で更新します。

cd ~/project
nano combinations.c

以下のコードを追加して、階乗と組み合わせ計算を実装します。

#include <stdio.h>

// 階乗を計算する関数
unsigned long long factorial(int num) {
    if (num == 0 || num == 1) {
        return 1;
    }

    unsigned long long result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }

    return result;
}

// 組み合わせ (nCr) を計算する関数
unsigned long long combinations(int n, int r) {
    // 入力を検証する
    if (r > n) {
        return 0;
    }

    // 組み合わせの公式:nCr = n! / (r! * (n-r)!) を使用
    unsigned long long numerator = factorial(n);
    unsigned long long denominator = factorial(r) * factorial(n - r);

    return numerator / denominator;
}

int main() {
    int n, r;

    // ユーザーに n と r の値を入力するよう促す
    printf("Enter the value of n: ");
    scanf("%d", &n);

    printf("Enter the value of r: ");
    scanf("%d", &r);

    // 組み合わせを計算して出力する
    unsigned long long result = combinations(n, r);

    printf("Combination C(%d, %d) = %llu\n", n, r, result);

    return 0;
}

コンパイルしてプログラムを実行します。

gcc combinations.c -o combinations
./combinations

出力例:

Enter the value of n: 5
Enter the value of r: 3
Combination C(5, 3) = 10

実装における重要な点:

  • factorial() 関数は、与えられた数の階乗を計算します。
  • combinations() 関数は、組み合わせの公式を実装します。
  • より大きな階乗計算を扱うために unsigned long long を使用します。
  • 無効な組み合わせを防ぐために入力を検証します。

結果の表示

このステップでは、組み合わせ計算プログラムをより詳細な出力とエラー処理を追加することで強化します。

combinations.c ファイルを開いてコードを修正します。

cd ~/project
nano combinations.c

改良された結果表示と入力検証でコードを更新します。

#include <stdio.h>

// 前の階乗と組み合わせ関数は同じまま

int main() {
    int n, r;

    // ユーザーに値を入力するよう促す
    printf("Combination (nCr) Calculator\n");
    printf("----------------------------\n");

    // 入力検証
    do {
        printf("Enter the total number of items (n): ");
        scanf("%d", &n);

        if (n < 0) {
            printf("Error: n は非負の整数でなければなりません。\n");
        }
    } while (n < 0);

    do {
        printf("Enter the number of items to choose (r): ");
        scanf("%d", &r);

        if (r < 0 || r > n) {
            printf("Error: r は 0 以上 n 以下の整数でなければなりません。\n");
        }
    } while (r < 0 || r > n);

    // 組み合わせを計算する
    unsigned long long result = combinations(n, r);

    // 詳細な結果出力
    printf("\nResult Breakdown:\n");
    printf("----------------\n");
    printf("Total items (n): %d\n", n);
    printf("Items to choose (r): %d\n", r);
    printf("Possible combinations (nCr): %llu\n", result);

    // 結果の説明
    printf("\nInterpretation:\n");
    printf("---------------\n");
    printf("%d 個のアイテムから %d 個のアイテムを選ぶ組み合わせは %llu 通りです。\n",
           n, r, result);

    return 0;
}

コンパイルしてプログラムを実行します。

gcc combinations.c -o combinations
./combinations

出力例:

Combination (nCr) Calculator
----------------------------
Enter the total number of items (n): 5
Enter the number of items to choose (r): 3

Result Breakdown:
----------------
Total items (n): 5
Items to choose (r): 3
Possible combinations (nCr): 10

Interpretation:
---------------
5 個のアイテムから 3 個のアイテムを選ぶ組み合わせは 10 通りです。

主な改善点:

  • 無効な入力を防ぐための入力検証を追加しました。
  • 詳細な結果の表示で出力を強化しました。
  • 組み合わせ結果の説明を追加しました。

まとめ

この実験では、n と r の入力値を読み取り、nCr = n! / (r! * (n-r)!) の公式を使って組み合わせ (nCr) を計算する方法を学びました。階乗と組み合わせを計算する関数を実装し、これらの関数を使って最終結果を計算しました。主な手順は、1) n と r の入力値を読み取る、2) 公式と階乗関数を使って組み合わせを計算する、でした。