重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

*/
入力した段数のパスカルの三角形をつくる
*/

#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
となってしまいます。
どこを直せばよいのでしょうか。教えて下さるとうれしいです。
よろしくお願い致します。

A 回答 (2件)

#1 で正しいはずなので蛇足ですが, こんなふうにすると高速化が期待できるかも:


配列を使って comb の再帰呼出しを減らしたついでに, printf の %*s も使ってみました.

#include <stdio.h>
#include <stdlib.h>

int main()
{
int ln;
int i, j;
int *comb;

do {
printf("段数を入れてください:");
scanf("%d", &ln);
} while (ln < 0);

comb = malloc((ln+1) * sizeof comb[0]);
for (i = 0; i <= ln; i++) {
comb[i] = 0;
}

comb[0] = 1;

for (i = 0; i < ln; i++) {
printf("%*s", ln-i, "");
for (j = 0; j <= i; j++) {
printf("%d ", comb[j]);
}
putchar('\n');

for (j = i; j >= 0; j--) {
comb[j+1] += comb[j];
}
}

free(comb);
return 0;
}
    • good
    • 0
この回答へのお礼

ご親切にありがとうがざいます!参考に致します。

お礼日時:2004/06/30 14:55

for(j = 0; j < i; j++){



for(j = 0; j <= i; j++){
と直せば良いと思います。
    • good
    • 0
この回答へのお礼

す、すみません。。。ありがとうございました。

お礼日時:2004/06/30 14:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!