Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で二項係数テーブルを出力するプログラムの作成方法


正の整数値(ここでは「val」とします)が与えられたとき、0からvalまでの範囲にある任意のnとkに対する二項係数B(n, k)の値を計算し、テーブル形式で出力するのが本記事の目的です。

二項係数とは

二項係数(n, k)とは、「n個の選択肢の中からk個を選ぶ組み合わせ」の総数を表す値です。正の整数nおよびkに対する二項係数は、次の式で定義されます。

$$C_k^n=\frac{n!}{(n-k)!k!}$$

ただし、条件として n >= k が満たされている必要があります。

計算例

入力: B(9,2)
出力:

$$B_2^9=\frac{9!}{(9-2)!2!}$$ 

$$\frac{9\times 8\times 7\times 6\times 5\times 4\times 3\times 2\times 1}{(6\times 5\times 4\times 3\times 2\times 1)\times 2\times 1}=\frac{362,880}{1440}=252$$

このように、9個の中から2個を選ぶ組み合わせの総数は252通りであることが分かります。

二項係数テーブルとは

二項係数テーブルとは、nとkのさまざまな組み合わせに対して生成される複数の値を、一度に計算・確認できるようにまとめた表のことです。いわゆる「パスカルの三角形」としても知られています。

計算例

入力: value = 5
出力:

C言語で二項係数テーブルを出力するプログラムの作成方法

プログラムのアプローチ

本プログラムでは、以下の手順で二項係数テーブルを生成します。

  • テーブルを生成するための上限値として、ユーザーから変数「val」を受け取ります。
  • 二項係数の値は0からvalの範囲に収まるため、0からvalまでループ処理を行います。
  • nとkがどちらも0でない場合、次の漸化式を適用して計算量を抑えます。
    B(m, x) = B(m, x - 1) * (m - x + 1) / x
  • 計算結果を出力します。

この漸化式を使うことで、階乗を毎回計算する必要がなくなり、効率的にテーブルを作成できます。

アルゴリズム

開始
ステップ1 -> 二項係数テーブル用の関数を宣言する
    int bin_table(int val)
    ループ: int i = 0 から i <= val まで、iを1ずつ増やす
        i の値を出力する
        int num = 1 を宣言する
        ループ: int j = 0 から j <= i まで、jを1ずつ増やす
            もし (i != 0 かつ j != 0) ならば
                num = num * (i - j + 1) / j を設定する
            終了
            num の値を出力する
        終了
        改行を出力する
    終了
ステップ2 -> main() 内での処理
    int value = 5 を宣言する
    bin_table(value) を呼び出す
終了

サンプルコード

#include <stdio.h>
// 二項係数テーブルを出力する関数
int bin_table(int val) {
    for (int i = 0; i <= val; i++) {
        printf("%2d", i);
        int num = 1;
        for (int j = 0; j <= i; j++) {
            if (i != 0 && j != 0)
            num = num * (i - j + 1) / j;
            printf("%4d", num);
        }
        printf("\n");
    }
}
int main() {
    int value = 5;
    bin_table(value);
    return 0;
}

実行結果

C言語で二項係数テーブルを出力するプログラムの作成方法

このプログラムを実行すると、value = 5 の場合、各行がnに対応し、その行内の各値が対応するkに対する二項係数を示す三角形状のテーブル(パスカルの三角形)が出力されます。


  1. 配列の全要素を乗算するC++プログラムの解説

    整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭

  2. C++で8進数を10進数に変換するプログラムの書き方

    8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて