次のようなツリーを構築する必要があります。
したがって、ユーザーから 2 つの数字を受け取りa
ますb
。a
行数をb
定義し、ルート ノードの開始値を定義します。a
=5 とb
=3 の場合、次のようになります。
私は基本的にそれをコンソールに出力するだけです。どうやって始めればいいのか、本当に迷っています。誰かが私を正しい方向に少し押してくれませんか?
次のようなツリーを構築する必要があります。
したがって、ユーザーから 2 つの数字を受け取りa
ますb
。a
行数をb
定義し、ルート ノードの開始値を定義します。a
=5 とb
=3 の場合、次のようになります。
私は基本的にそれをコンソールに出力するだけです。どうやって始めればいいのか、本当に迷っています。誰かが私を正しい方向に少し押してくれませんか?
これはパスカルの三角形で、行 n、列 k の値は b * (n choose k) です。ここで、n と k は両方ともゼロ インデックスであり、(n choose k) = n! / (k! * (nk)!)
これを理解したら、問題の解決策は、関数を作成int choose(int n, int k)
し、コンソールに四角形を配置することになります。
レイアウトは最も難しい部分ですが、アプローチは次のとおりです。
int choose(int n, int k)
printf("%-*d ", W, b * choose(n, k));
。1 つの方法は、ツリーを下方向に「成長」させることです。行数が与えられると、ツリー内の要素数を把握し、適切なサイズの配列を割り当てることができます。
次に、1 から番号が付けられた行を想定して、一番上から開始します。down_left(x) = x + row(x)
ここx
で、 は配列インデックスでrow(x)
あり、 は行番号がx
属しています。down_right(x) = down_left(x) + 1
.
上から始めて、down_left と down_right に進みます。次に、作成した次の行の各要素に対して、「親」番号の累積効果を得るために下の行に追加することを除いて、同じことを行います。
たとえば、ユーザーが 3 行と 3 のルート値を要求した場合。
6 つの配列要素が必要になることがわかっています。6 つの要素を割り当ててゼロにします。
3
行 1:配列 [0] に置きます。行 n: 前の行の各要素を見て作成し、それを i と呼びます。次に、array[down_left(i)] += i
と を行いarray[down_right(i)] += i
ます。これにより、行 n が作成されます。繰り返す。
とにかく、それは大まかなアイデアです。プレイして、どこに到達するかを確認してください... :)