0

次のコードスニペットはパスカルの三角形を印刷しています。インターネットからこのスニペットを入手しましたが、binの数式を取得できません。誰かがそれを手伝ってくれるなら、私は感謝します\

#include<stdio.h>
int main()
{
    int bin=1,p,q=0,r,x;
    clrscr();
    printf("Rows you want to input:");
    scanf("%d",&r);
    printf("\nPascal's Triangle:\n");
    while(q<r)
    {   
        printf("ROW %d",q);
        for(p=40-3*q;p>0;--p)
        printf(" ");
        for(x=0;x<=q;++x)
        {
            if((x==0)||(q==0))
            bin=1;
            else
            bin=(bin*(q-x+1))/x;
            printf("%6d",bin);
        }
        printf("\n");
        ++q;
    }
    getchar();
    return 0;
}
4

2 に答える 2

1

ループ内のbinを計算するために使用される値を出力して、それがどのように機能するかを理解します

    /* ... */
    else
    {
        printf("new bin=(%d*(%d-%d*1))/%d\n", bin, q, x, x);
        bin=(bin*(q-x*1))/x;
    }
于 2010-10-30T11:36:27.607 に答える
1

では、見てみましょう。実際の式は内側の for ループです。

    for(x=0;x<=q;++x)
    {
        if((x==0)||(q==0))
          bin=1;
        else
          bin=(bin*(q-x+1))/x;
        printf("%6d",bin);
    }

q は、上から始まるパスカル三角形の行を表します。x は行の要素番号を表します。行 1 には 1 つの要素があり、行 2 には 2 つの要素があります。したがって、for(x=0;x<=q;++x)理にかなっています。

次に if 節に進みif((x==0)||(q==0))ます。x が 0 の場合、三角形の左側または三角形の行の先頭にあり、常に 1 です。q が明らかに 0 の場合、これは三角形の最初の行 (上から始まる) であり、常に1. 要素が 1 つしかないため。

おそらく最も興味深い部分であるelse句に移ります。

    else
      bin=(bin*(q-x+1))/x;

この句に初めて入るのは、ループの開始時に q が 0 で x が 0 で、1 に設定された後です。bin は for ループの外で定義され、反復から反復まで値を保持するため、これは重要です。 . したがって、x は 2 で bin は 1 です。ここでも、q は行番号と行の長さを表します。これを理解するには、ウィキペディアのパスカルの三角形のページを参照してください。特に

個々の行または対角線を単独で計算する

そこに再び書き留められた式があります。ここで重要なのは階乗です。パスカル マトリックスに関する記事も参照してください。私はそれを説明しようとしますが、(誰かがそう言うのは嫌いです)あなたはそれを見なければなりません. パスカル三角形の対角線と式の内側を見てください(q-x+1)。次に、すべての対角線に対して常に得られる値を計算します。パターンが見えますか?今、物事が理にかなっていることを願っています。

于 2010-10-30T16:03:50.543 に答える