パスカルの三角形
ループ制御と計算
アルゴリズム関連の書物でしばしば見かけるアルゴリズムです
実際にみると、さほど複雑な内容でもなく
計算も、普通の公立高校程度の知識があれば理解できる内容です
まずパスカルの三角形ですが、頂点を1として、必ず斜め上の値を加算したものが下にきます
数学的に見ると、行を i 列を j とし、行は頂点、列は左を0と考え
その関係はiCjにあることがわかります
例えば、三角形の 3 行目は、3C0 , 3C1 , 3C2 , 3C3 となるでしょう
(この計算式は、たとえば5C2であれば、5 * 4 / 2 * 1 を行う)
そこで、まずはこの計算モジュールを作成してみようと思います
モジュールでやらなければならない計算は、iCjの場合
iをj回、毎回1減算しながら乗算した和と、jが0になるまで毎回1減算しながら乗算した和を得
それを除算した結果を返せばよいですね
int getMathC(int i , int j) {
int x = 1 , tmp = 1 , cou = j;
if ( i == 0 ) return 1;
if ( i == j ) return 1;
if ( j == 1) return i;
for (; cou > 0 ; cou-- , i--) x *= i;
for (; j > 0 ; j--) tmp *= j;
x = x / tmp;
return x;
}
i が 0 だったり、i と j が同じ値であれば、必ず1になります
そのため、まず計算が必要かどうかを選択して、必要のない場合は適切な値を返しています
最初のfor文は、iをj回、繰り返すごとに1減算しながら乗算した和をxに代入しています
次のfor文は j を1減算しながら0になるまで乗算した和を tmp に代入しています
最後に x を tmp で除算することで iCj を表現しています
これができれば、あとは原理に基いて出力するだけです
問題は空白をどう表現するかですが、これには様々なアプローチがあるでしょう
今回は、比較的簡単な配列を用いた方法を採用します
まず、配列内のデータを全てスペースの空白で埋めます
そして、空白の終端に0を代入しておけば、C言語の場合はそこで文字列が終わります
0を代入する位置は頂点を最大行数 * 2の位置にするようにします
こうすれば、行ごとに最大行数 - 行 * 2 で縮まっていく空白を表現できます
#include <stdio.h>
int getMathC( int , int );
int main() {
char sp[128];
int i = 0 , j = 0 , count , n_count , height = 5;
for (count = 0 ; count < 128 ; count++) sp[count] = ' ';
for (count = 0 ; count < height ; count++ , j = 0 , i++) {
sp[(height - count) * 2] = 0;
printf("%s" , sp);
for (n_count = 0 ; n_count <= count ; n_count++ , j++ ) {
printf("%d " , getMathC( i , j ) );
}
printf("\n");
}
return 0;
}
int getMathC(int i , int j) {
int x = 1 , tmp = 1 , cou = j;
if ( i == 0 ) return 1;
if ( i == j ) return 1;
if ( j == 1) return i;
for (; cou > 0 ; cou-- , i--) x *= i;
for (; j > 0 ; j--) tmp *= j;
x = x / tmp;
return x;
}
このプログラムでは、2桁以上の数が出力されると
空白の関係でレイアウトが崩れてしまいますが、パスカルの三角形を表現しています
main()関数内の変数 height の値を変えると行数が変化します