C 言語で順列 (nPr) を計算する方法

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

はじめに

この実験では、C 言語で順列 (nPr) を計算する方法を学びます。この実験は、以下の手順で構成されています。

最初に、順列の計算に必要な n と r の入力値を読み取ります。scanf() 関数を使用してユーザーから入力を受け取り、入力値を出力して確認します。

次に、階乗と順列 (nPr) を計算する関数を実装します。計算式は nPr = n! / (n-r)! です。r が n より大きい場合、エラーメッセージを表示します。

n と r の入力

このステップでは、C プログラミングで順列を計算するために必要な n と r の入力値を読み取る方法を学びます。

まず、順列計算プログラムを実装するための新しい C ファイルを作成しましょう。

cd ~/project
nano permutations.c

次に、入力値を読み取るコードを記述します。

#include <stdio.h>

int main() {
    int n, r;

    printf("アイテムの総数 (n) を入力してください:");
    scanf("%d", &n);

    printf("選択するアイテムの数 (r) を入力してください:");
    scanf("%d", &r);

    printf("入力された値:n = %d, r = %d\n", n, r);

    return 0;
}

実行例:

アイテムの総数 (n) を入力してください: 5
選択するアイテムの数 (r) を入力してください: 3
入力された値: n = 5, r = 3

コードの詳細:

  • scanf() を使用して、ユーザーから整数を入力を読み取ります。
  • %d は整数の書式指定子です。
  • &n&r は、入力値が格納されるメモリアドレスです。
  • 入力された値を出力して、入力を確認します。

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

gcc permutations.c -o permutations
./permutations

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

このステップでは、階乗の計算によって順列 (nPr) を計算する関数を実装します。

以前の permutations.c ファイルを修正して、階乗計算と順列計算を追加しましょう。

cd ~/project
nano permutations.c

次に、階乗と順列計算関数でコードを更新します。

#include <stdio.h>

// 階乗を計算する関数
unsigned long long factorial(int num) {
    unsigned long long result = 1;
    for (int i = 1; i <= num; i++) {
        result *= i;
    }
    return result;
}

// 順列 (nPr) を計算する関数
unsigned long long permutation(int n, int r) {
    // 無効な入力をチェック
    if (r > n) {
        printf("Error: r は n より大きくできません\n");
        return 0;
    }

    // 式 n! / (n-r)! を使って nPr を計算
    return factorial(n) / factorial(n - r);
}

int main() {
    int n, r;

    printf("アイテムの総数 (n) を入力してください:");
    scanf("%d", &n);

    printf("選択するアイテムの数 (r) を入力してください:");
    scanf("%d", &r);

    unsigned long long result = permutation(n, r);

    if (result > 0) {
        printf("%d 個のアイテムから %d 個選ぶ順列 (nPr) は:%llu\n", n, r, result);
    }

    return 0;
}

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

gcc permutations.c -o permutations
./permutations

実行例:

アイテムの総数 (n) を入力してください: 5
選択するアイテムの数 (r) を入力してください: 3
5 個のアイテムから 3 個選ぶ順列 (nPr) は: 60

実装に関する重要な点:

  • factorial() 関数は、与えられた数の階乗を計算します。
  • permutation() 関数は、nPr の式 n! / (n-r)! を実装します。
  • より大きな階乗値を扱うために unsigned long long を使用しています。
  • 入力検証で、r が n 以下であることを確認しています。

結果の表示

このステップでは、順列計算プログラムを拡張して、より詳細な出力とフォーマットオプションを追加します。

permutations.c ファイルを修正して、結果の表示を改善しましょう。

cd ~/project
nano permutations.c

結果表示を改善したコードを更新します。

#include <stdio.h>

// 階乗を計算する関数
unsigned long long factorial(int num) {
    unsigned long long result = 1;
    for (int i = 1; i <= num; i++) {
        result *= i;
    }
    return result;
}

// 順列 (nPr) を計算する関数
unsigned long long permutation(int n, int r) {
    // 無効な入力をチェック
    if (r > n) {
        printf("Error: r は n より大きくできません\n");
        return 0;
    }

    // 式 n! / (n-r)! を使って nPr を計算
    return factorial(n) / factorial(n - r);
}

// 詳細な順列計算の説明を表示する関数
void printPermutationDetails(int n, int r, unsigned long long result) {
    printf("\n--- 順列計算詳細 ---\n");
    printf("アイテムの総数 (n): %d\n", n);
    printf("選択するアイテムの数 (r): %d\n", r);
    printf("計算:%d P %d = %d! / (%d - %d)!\n", n, r, n, n, r);
    printf("結果:%llu 通りの異なる配置が可能です\n", result);
    printf("----------------------------------------\n");
}

int main() {
    int n, r;

    printf("順列 (nPr) 計算機\n");
    printf("アイテムの総数 (n) を入力してください:");
    scanf("%d", &n);

    printf("選択するアイテムの数 (r) を入力してください:");
    scanf("%d", &r);

    unsigned long long result = permutation(n, r);

    if (result > 0) {
        printPermutationDetails(n, r, result);
    }

    return 0;
}

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

gcc permutations.c -o permutations
./permutations

実行例:

順列 (nPr) 計算機
アイテムの総数 (n) を入力してください: 5
選択するアイテムの数 (r) を入力してください: 3

--- 順列計算詳細 ---
アイテムの総数 (n): 5
選択するアイテムの数 (r): 3
計算: 5 P 3 = 5! / (5 - 3)!
結果: 60通りの異なる配置が可能です
----------------------------------------

主な改善点:

  • 専用の printPermutationDetails() 関数を追加しました。
  • 計算の詳細な情報を表示するように出力を改善しました。
  • 順列の式と結果を説明しました。
  • タイトルと詳細な説明でユーザーインターフェースを改善しました。

まとめ

この実験では、C プログラミングで順列を計算するために必須の n と r の入力値を読み取る方法を学びました。また、n! / (n-r)! という式を使って階乗と順列 (nPr) を計算する関数を実装しました。

主な学習ポイントは、整数入力を読み取るための scanf() の使用、階乗と順列計算関数の作成、r が n より大きい場合の無効な入力の処理です。