• 締切済み

パスカルの三角形についてのCプログラムの解説をお願いします!

プログラミング初心者です。 先日『nが入力されたときに、n段のパスカルの三角形を出力するプログラムを作成しなさい』という課題が出ました。 まだ理解しきれていないところが多いもので、手元にある資料をマネて、とりあえず動いてくれるように書いてみました。 今消化不良をおこしているのは以下の2点です。 1 一部理解できない箇所がある →解説をいただきたい 2 出力される三角形が、パスカルの三角形ではなくただの『d』の三角形になってしまう →どこが間違っているのかご指摘いただきたい 以下が書いたプログラムです。 #include<stdio.h> int comb(int n, int r) { if (r==0 || r==n) return 1; elese return comb(n - 1, r - 1) + comb(n - 1, r); } main() { int n,i,j; printf("n?"); scanf("%d",&n); for (i=0; i<=n, i++) { for(j=0; j<=i, j++) { printf("d%",comb(i,j)); } printf("\n"); } } ちなみに理解できていない(自分自身で説明できない)箇所は main関数の前、 if (r==0 || r==n) return 1; elese return comb(n - 1, r - 1) + comb(n - 1, r); の二行です。お恥ずかしい話、記号の意味もよくわかってません; どなたかご指導お願いします!!(><)

みんなの回答

  • maya9156
  • ベストアンサー率0% (0/0)
回答No.3

※質問者です。 パスワード忘れで再登録したのでこちらから失礼します お二人とも本当に有難うございます。 綴りミスを直して実行できました^^ お二人の解説ポイントを中心に確認して、内容のおさらいもできました。的確なアドバイス、本当に有難うございました!!! とても参考になりました。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

>理解できていない(自分自身で説明できない)箇所は >if (r==0 || r==n) return 1; >elese return comb(n - 1, r - 1) + comb(n - 1, r); >の二行です。 組み合わせ comb(n, r) の値は ・comb(n, 0) または comb(n, n) のときは 1 ・それ以外のときは回答No.1にある等式の右辺を使って計算 ということを表しています。 再帰呼び出しを知らないと理解できないでしょう。 >2 出力される三角形が、パスカルの三角形ではなくただの『d』の三角形になってしまう >→どこが間違っているのかご指摘いただきたい dを出力している行は上記のプログラムの中に一つしかありません。そこを直せばいいだけです。printfの例題の初歩。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

下に挙げることを理解していればプログラムの意味も分かるし、間違いも修正できます。 ・関数combは数学の組み合わせ (combination) を表している ・パスカルの三角形は組み合わせと密接な関係がある ・組み合わせについて、nCr = (n-1)Cr + (n-1)C(r-1) という等式が成り立つ ・再帰呼び出し ・||は論理積を表す ・printf()でint型の値を出力するにはどう書けばいいか ・elseのつづり ・for文の ( ) の中にはセミコロンが2つ要る

関連するQ&A

  • パスカルのピラミッドを作りたいのですが...

    */ 入力した段数のパスカルの三角形をつくる */ #include <stdio.h> /*---nCr値を返す---*/ int comb(int n,int r) { if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); for (i = 0; i < ln; i++){ for(j = 0;j < ln - i;j++) putchar(' '); for(j = 0; j < i; j++){ printf("%d",comb(i,j)); printf(" "); } putchar('\n'); } return (0); } と作ったら、うまく 1 1 1 1 2 1 1 3 3 1 とは表示されず、 1 1 2 1 3 3 1 4 6 4 となってしまいます。 どこを直せばよいのでしょうか。教えて下さるとうれしいです。 よろしくお願い致します。

  • c言語 パスカルの三角形

    c言語でパスカルの三角形を出力するプログラムを作りたいのですが、上手くいきません。 何を直せばいいのか教えてください。 #include <stdio.h> #define N 10 int main(void){ int i, j = 1, x, y; int d[N][N]; /* 三角形を作成 */ for (i = 1 ; i < N ; i++){ d[i][0] = 1; while (j <= i - 1){ d[i][j] = d[i-1][j-1] + d[i-1][j]; j ++; } } /* 三角形の表示 */ for (y = 0; y < N; y++) { for (x = 0; x < N-y; x++) printf(" "); for (x = 0; x < y; x++) printf("%3d ", d[x][y]); printf("\n"); } return 0; } 実行結果 -2147417616 2665208 1629976532 1627572249 1629101723 1 1629982744 2665256 2665548 3407923 1629345053 1627571017 0 3538997 1629739051 10 1629345053 2665368 3670071 2665384 1629739040 1627927140 2665244 1628040295 57 1628810863 1629476960 1628602749 2665560 2665304 1629345053 0 1629739040 1629740576 1628992224 2 4411498 1628040588 -2147417600 0 1629476960 1629740664 1629739040 1 267574 0

  • パスカルの三角形

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

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 簡単なプログラムの解説お願いします。

    #include<stdio.h> int main(void){ int i, j, temp, array[]={2, 7, 5, 4}; for(i = 0; i < 4; ++i){ for(j = i + 1; j < 4; ++j){ if(array[ i ] < array[ j ]){ temp = array[ i ]; array[ i ] = array[ j ]; array[ j ] = temp; } } for(j = 0; j < 4; ++j){ printf("%d,",array[j]); } printf("\n"); } return 0; } 7,2,5,4, 7,5,2,4, 7,5,4,2, 7,5,4,2, 答えはこのように表示されているんですが なぜこうなるのかが分かりません。 解説お願いします。

  • 組み合わせ

    n個の集合からp個を取る組み合わせの総数を出力するプログラムなんですが nCp=n!/p!(n-p)!という式を使い #include<stdio.h> int kaijo(int m); int comb(int n,int p); int main(void) { int i,j; printf("n="); scanf("%d",&i); printf("p="); scanf("%d",&j); printf("comb(%d,%d)=%d\n",i,j,comb(i,j)); } int kaijo(int m) { if(m>0) return(m*kaijo(m-1)); else return 1; } int comb(int n,int p) { if(n>0) return((n*kaijo(n-1))/(p*kaijo(p-1)*(n-p)*kaijo(n-p-1))); else return 1; } と書いてみたのですがこれではnが大きいとC言語のint型で扱える最大値を超えてしまい正しい結果が出力されません。  そこでint型を使ったままでnやpが大きい場合でもある程度出力できるようにしたいのですがどう改良したらよいのでしょうか? おそらくnCp=n*(n-1)*・・・*(n-p+1)/p!という式を使うのですがよく分かりません。よろしくお願いします。

  • 【C→JAVA】素数の組の数を求めるプログラム

    以下はC言語のプログラムです。 標準入力に正の偶数値 n(2≦n≦10,000) を入力すると足して n になる素数の組の数を求め、 標準出力に出力するプログラムなのですが、 これをJAVA用のプログラムに置き換えるとすると どのようなプログラムになるのでしょうか? よろしくお願いいたします。 #include <stdio.h> #include <math.h> //Compiler version gcc 6.3.0 #define N 10000 int primes[N + 1] = {0}; void sieve(int); int main() { int n,count = 0; sieve(N); scanf("%d",&n); for (int i = 1;i <= n / 2 + 1;i++) { for (int j = i + 1;j < n;j++) { if (primes[i] && primes[j] && i + j == n) { count++; } } } printf("%d\n",count); return 0; } void sieve(int n) { int limit = (int)sqrt(n) + 1; for (int i = 2;i <= n;i++) { primes[i] = 1; } for (int i = 2;i < limit;i++) { if (primes[i]) { for (int j = 2; i * j <= n;j++) { primes[i * j] = 0; } } } }

  • プログラムの説明をお願いします!

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1319406053 の回答を参考にして、入力されたnに対するn!を求めるプログラムを作りました。(0<=n<10000) 実行して出力できたのですが、情けない話ですがプログラムがどう動いているのかがさっぱりわかりません。 どなたか解説をお願いします。 #include <stdio.h> int main(void) { int c[10000]; int i, j, t, n; for (i=0; i<9999; i++) { c[i] = 0; } c[9999]=1; scanf("%d", &n); for (i=1; i<=n; i++) { t=0; for (j=9999;j>=0; j--){ c[j] = c[j] * i + t; t = c[j] /10000; c[j] %= 10000; } } for (i=0; i<10000; i++) {  /* (1) */ if (c[i] > 0) { break; } } printf("%d", c[i++]); for(i=i; i<10000; i++) { printf("%04d", c[i]); /* (2) */ printf("\n"); return 0; } 特に、 (1)ここの繰り返しは何をやっているのでしょうか? (2)なぜ4ケタ0詰めにするのでしょうか? よろしくお願いします。

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • 解説求む

    #include <stdio.h> int main(void) { char s[256]; int i, n[3] = {0, 1, 0};   printf("英文を入力して下さい:"); fgets(s, sizeof s, stdin); for (i = 0; s[i]; i++) if (s[i] == '\n') break; s[i] = '\0'; for (i = 0; s[i]; i++) n[0]++; for (i = 0; s[i]; i++) if (s[i] == ' ') n[1]++; for (i = 0; s[i]; i++) if (s[i] == '.' || s[i] == '?' || s[i] == '!' || s[i] == ',' || s[i] == '/') n[2]++; printf("文字数は%dです。\n", n[0]); printf("単語数は%dです。\n", n[1]);   printf("文の数は%dです。\n", n[2]); return 0; } このプログラムゎ英文の文字数と単語数と文数を数えて表示させるものなんですが、これのフローチャート的なものを詳しく教えていただけるとありがたいです。全体的にあんまり理解できなくて…

専門家に質問してみよう