的三角形, 其实质是二项式 (a+b) 的 n 次方展开后各项的系数排成的三角形, 它的特点是左右两边全是 1, 从第二行起, 中间的每一个数是上一行里相邻两个数之和. 这个题目常用于程序设计的练习.
下面给出六种不同的解法.
解法一
- #include <stdio.h>
- main()
- { int i,j,n=0,a[17][17]={0};
- while(n<1 || n>16)
- { printf("请输入杨辉三角形的行数:");
- scanf("%d",&n);
- }
- for(i=0;i<n;i++)
- a[i][0]=1; /* 第一列全置为一 */
- for(i=1;i<n;i++)
- for(j=1;j<=i;j++)
- a[i][j]=a[i-1][j-1]+a[i-1][j];/* 每个数是上面两数之和 */
- for(i=0;i<n;i++) /* 输出杨辉三角 */
- { for(j=0;j<=i;j++)
- printf("]",a[i][j]);
- printf("\n");
- }
- }
点评: 解法一是一般最容易想到的解法, 各部分功能独立, 程序浅显易懂.
解法二
- #include <stdio.h>
- main()
- { int i,j,n=0,a[17][17]={1};
- while(n<1 || n>16)
- { printf("请输入杨辉三角形的行数:");
- scanf("%d",&n);
- }
- for(i=1;i<n;i++)
- { a[i][0]=1; /* 第一列全置为一 */
- for(j=1;j<=i;j++)
- a[i][j]=a[i-1][j-1]+a[i-1][j]; /* 每个数是上面两数之和 */
- }
- for(i=0;i<n;i++) /* 输出杨辉三角 */
- { for(j=0;j<=i;j++)
- printf("]",a[i][j]);
- printf("\n");
- }
- }
点评: 解法二是在解法一的基础上, 把第一列置为 1 的命令移到下面的双重循环中, 减少了一个循环. 注意初始化数组的变化.
解法三
- #include <stdio.h>
- main()
- { int i,j,n=0,a[17][17]={0,1};
- while(n<1 || n>16)
- { printf("请输入杨辉三角形的行数:");
- scanf("%d",&n);
- }
- for(i=1;i<=n;i++)
- for(j=1;j<=i;j++)
- a[i][j]=a[i-1][j-1]+a[i-1][j]; /* 每个数是上面两数之和 */
- for(i=1;i<=n;i++) /* 输出杨辉三角 */
- { for(j=1;j<=i;j++) printf("]",a[i][j]);
- printf("\n");
- }
- }
点评: 解法三是在解法一, 二的基础上, 把第一列置为 1 的命令去掉了, 注意初始化数组的变化.
解法四
- #include <stdio.h>
- main()
- { int i,j,n=0,a[17][17]={0,1};
- while(n<1 || n>16)
- { printf("请输入杨辉三角形的行数:");
- scanf("%d",&n);
- }
- for(i=1;i<=n;i++)
- { for(j=1;j<=i;j++)
- { a[i][j]=a[i-1][j-1]+a[i-1][j]; /* 每个数是上面两数之和 */
- printf("]",a[i][j]); /* 输出杨辉三角 */
- }
- printf("\n");
- }
- }
点评: 解法四是在解法三的基础上, 把计算和打印合并在一个双重循环中.
解法五
- #include <stdio.h>
- main()
- { int i,j,n=0,a[17]={1},b[17];
- while(n<1 || n>16)
- { printf("请输入杨辉三角形的行数:");
- scanf("%d",&n);
- }
- for(i=0;i<n;i++)
- { b[0]=a[0];
- for(j=1;j<=i;j++)
- b[j]=a[j-1]+a[j]; /* 每个数是上面两数之和 */
- for(j=0;j<=i;j++)
- /* 输出杨辉三角 */
- { a[j]=b[j]; /* 把算得的新行赋给 a, 用于打印和下一次计算 */
- printf("]",a[j]);
- }
- printf("\n");
- }
- }
点评: 解法一到解法四都用了二维数组, 占用的空间较多. 而解法五只使用了两个一维数组.
解法六
- #include <stdio.h>
- main()
- { int i,j,n=0,a[17]={0,1},l,r;
- while(n<1 || n>16)
- { printf("请输入杨辉三角形的行数:");
- scanf("%d",&n);
- }
- for(i=1;i<=n;i++)
- { l=0;
- for(j=1;j<=i;j++)
- { r=a[j];
- a[j]=l+r; /* 每个数是上面两数之和 */
- l=r;
- printf("]",a[j]); /* 输出杨辉三角 */
- }
- printf("\n");
- }
- }
点评: 解法六只使用了一个一维数组和两个临时变量.
来源: http://www.jianshu.com/p/cf1f4bcd7bad