帕斯卡三角帮助

时间:2010-10-30 11:11:21

标签: c loops nested-loops

下面的代码片段打印出Pascals三角形,我从互联网上获得了这个片段,但是我无法获得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;
}

2 个答案:

答案 0 :(得分:1)

打印用于计算循环中bin的值,以了解其工作原理

    /* ... */
    else
    {
        printf("new bin=(%d*(%d-%d*1))/%d\n", bin, q, x, x);
        bin=(bin*(q-x*1))/x;
    }

答案 1 :(得分:1)

好的,我们来看看吧。 实际公式是内循环:

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

q代表pascal三角形的行,从顶部开始。 x表示行中的元素编号。因为在第1行中,第2行中将有1个元素是两个元素。 所以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代表行号和行的长度。要理解这一点,您应该查看pascal's triangle的维基百科页面。特别是

的部分
  

计算单个行或   对角线本身

在那里你会发现再次写下公式。这里的重要词是阶乘。另外,查看有关pascal matrix的文章可能会有所帮助。 我会试着解释一下,但是(当有人这么说时我很讨厌)你必须看到它。看一下帕斯卡三角形的对角线和公式(q-x+1)的内部部分。现在计算你将为每个对角线获得的值。你看到一个模式?我希望现在事情开始变得有意义了。