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 行中有两个元素。所以for(x=0;x<=q;++x)说得通。

现在到 if 子句if((x==0)||(q==0))。如果 x 为 0,则我们位于三角形的左侧或三角形行的开头,始终为 1。如果 q 为 0,则显然这是三角形的第一行(从顶部开始),也始终为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 回答