下面的代码片段打印出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;
}
答案 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)
的内部部分。现在计算你将为每个对角线获得的值。你看到一个模式?我希望现在事情开始变得有意义了。