P5732 杨辉三角

P5732 杨辉三角

题目描述:给出 n(n≤20),输出杨辉三角的前n行。

杨辉三角是一种神奇的三角形,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
杨辉三角前6行样例为:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
我们不难发现,每一项都等于它上方和左上方项数之和。
由此我们便可以写出杨辉三角的通项公式:
a[i][j]=a[i-1][j-1]+a[i-1][j]
于是我们便能写出代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[25][25];
int main()
{
    scanf("%d",&n);
    a[1][1]=1;a[2][1]=1;a[2][2]=1;a[3][1]=1;a[3][2]=2;a[3][3]=1; //给前几项赋值
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {    
            a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }  
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)  
{ cout
<<a[i][j]<<" "; if(i==j) //判断换行 { cout<<endl; } } } return 0; }

然而运行结果却不尽如人意,并没有得到杨辉三角,反而出现了许多很大的数。很明显,程序需要改进。

我们再看一下杨辉三角。我们可以发现,它的第一列和每行最后一项都为“1”,即:

if(j==1)
{
       a[i][j]=1;
}  
if(i==j)
{
        a[i][j]=1;
}  

故程序可以升级为:

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[25][25];
int main()
{
    scanf("%d",&n);
    a[1][1]=1;a[2][1]=1;a[2][2]=1;a[3][1]=1;a[3][2]=2;a[3][3]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {    
            a[i][j]=a[i-1][j-1]+a[i-1][j];
              if(j==1)  //处理第一列
             {
                 a[i][j]=1;
            }  
             if(i==j)  //处理每行最后一个
             {
                  a[i][j]=1;
            }  
        }
    }  
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cout<<a[i][j]<<" ";
            if(i==j)
            {
                 cout<<endl;
            }  
        }
    }  
    return 0;
}

此时运行就没问题了,可以AC。

杨辉三角还有其他性质,比如将每一项都模2,就有:

              1

            1 1

          1 0 1

        1 1 1 1

      1 0 0 0 1

    1 1 0 0 1 1

  1 0 1 0 1 0 1

1 1 1 1 1 1 1 1

此时杨辉三角成了只由“0”、“1”组成的三角。


posted @ 2020-07-19 11:09  Na2S2O3  阅读(554)  评论(1编辑  收藏  举报