- ベストアンサー
パスカルの三角形
一次元配列でパスカルの三角形を表示したいのですがうまくいきません。三角形の左上と右上をうまく足すことが出来ません。教えてください。作ってみたプログラムを載せます。 int comb[N+1]; int i,j,a; int main (){ for(i=0;i<=N;i++){ comb[i]=0; } for(i=0;i<=N;i++){ for(j=0;j<=i;j++){ if(j==0||j==i){ comb[j]=1; }else{ comb[j]=comb[j]+comb[j-1]; } } printf("\n"); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1行の計算を前(0~)から行なうと前回値(comb[j-1])が上書きされている為、結果が可笑しくなります。 1行の計算を後ろ(i~)から行なうと前回値が上書きされない為上手く行きます。 結果表示は後ろからになりますが、1行の計算値は対象なので見た目は同じです。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
>そもそも一次元配列(直線上)で実装しようとすることに >無理がありませんか? これは工夫次第でできそうですね。ところで、 >printf("%3d\n"); この文で何を出力しようとしていますか?
補足
本当にすみません。 printf("%3d",comb[j]); の間違いです。 Nを5としてこのプログラムを実行すると 1 1 1 1 2 1 1 3 4 1 1 4 8 9 1 1 5 13 22 23 1 となります。
- asuncion
- ベストアンサー率33% (2127/6289)
>一次元配列で パスカルの三角形は平面上に展開していくので、 そもそも一次元配列(直線上)で実装しようとすることに 無理がありませんか? ところで、お作りになったプログラムには 結果を出力する部分が見あたりません。 そういうコードを提示して「うまくいかない」と言われましても…。
補足
すみません写しもれでした。 正しくは int comb[N+1]; int i,j,a; int main (){ for(i=0;i<=N;i++){ comb[i]=0; } for(i=0;i<=N;i++){ for(j=0;j<=i;j++){ if(j==0||j==i){ comb[j]=1; }else{ comb[j]=comb[j]+comb[j-1]; } printf("%3d\n"); } printf("\n"); } でした。
補足
分かりやすいご回答ありがとうございます。 前からっていうのが頭にあって後ろからって言うのに気付きませんでした。よく考えれば対象ですもんね。 おかげで完成することが出来ました。