• ベストアンサー

パスカルの三角形

一次元配列でパスカルの三角形を表示したいのですがうまくいきません。三角形の左上と右上をうまく足すことが出来ません。教えてください。作ってみたプログラムを載せます。 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"); }

質問者が選んだベストアンサー

  • ベストアンサー
  • nas02
  • ベストアンサー率70% (22/31)
回答No.3

1行の計算を前(0~)から行なうと前回値(comb[j-1])が上書きされている為、結果が可笑しくなります。 1行の計算を後ろ(i~)から行なうと前回値が上書きされない為上手く行きます。 結果表示は後ろからになりますが、1行の計算値は対象なので見た目は同じです。

maa1213
質問者

補足

分かりやすいご回答ありがとうございます。 前からっていうのが頭にあって後ろからって言うのに気付きませんでした。よく考えれば対象ですもんね。 おかげで完成することが出来ました。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>そもそも一次元配列(直線上)で実装しようとすることに >無理がありませんか? これは工夫次第でできそうですね。ところで、 >printf("%3d\n"); この文で何を出力しようとしていますか?

maa1213
質問者

補足

本当にすみません。 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)
回答No.1

>一次元配列で パスカルの三角形は平面上に展開していくので、 そもそも一次元配列(直線上)で実装しようとすることに 無理がありませんか? ところで、お作りになったプログラムには 結果を出力する部分が見あたりません。 そういうコードを提示して「うまくいかない」と言われましても…。

maa1213
質問者

補足

すみません写しもれでした。 正しくは 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"); } でした。

関連するQ&A