杨辉三角是二项式系数在三角形中的一种几何排列
如上图所示,每一行的第一个和最后一个都是1,每一个数等于它上方两个数之和。
编写代码在屏幕上打印如图所示杨辉三角(不包括图中n那一列)数组
方法一:用二维数组实现
用二维数组打印杨辉三角问题与打印乘法表相似,第一个[ ]表示打印的行数,第二个[ ]表示打印的列数,再用两层for循环遍历,给每个元素赋相应的值。赋好值以后,再用两层for循环遍历进行打印出来。如下是具体步骤:ide
1)创建二维数组(此处举例为a[ ][ ]),并设好下标(即打印的杨辉三角层数)。此处建议使用宏定义,方便之后修改层数。 函数
#define ROW 10 #define COL 10
ps:此处举例,打印的是10层,若想打印更多(少),直接改10就行。杨辉三角的行数与列数是相等的,若是宏定义的值不相等,打印结果是有问题的。ui
2)创建好数组后开始赋值。咱们发现杨辉三角第一层和之后每一层的第一个数及最后一个数都是1,这是固定不变的,所以这些特殊的位置须要单独赋值。其余的位置经过规律(该数等于它上方两数之和)用for循环进行赋值便可。3d
a)第一层可直接赋值为1。code
a[0][0] = 1; //第一层在数组里下标为0
b)第一层赋好以后,用for进行其他层的第一个和最后一个的赋值。blog
for (i = 1; i < ROW; ++i){//下标i(层数=i+1)从1开始(第二层) a[i][0] = 1; //a[i][0]:第i+1层的第一个位置。 a[i][i] = 1; //a[i][i]: 第i+1层的最后一个位置。 }
c)其他有规律的位置的赋值用一层for循环(这一层for要嵌套在上一层for循环里)搞定it
for (j = 1; j < i; ++j) {//j(第i+1层第j+1个位置),一样从第二个位置开始(第一个位置在上一步骤已经赋过了)j<i,同理。 a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//该数的上方两个位置分别为正上方和左上方。 }
3)打印该二位数组。io
a)用两层for循环遍历便可for循环
for (i = 0; i < ROW; ++i) { for (j = 0; j <=i; ++j) { printf("%d ", a[i][j]); } printf("\n"); }
结果如上图所示,但发现结果并非很好看。
b)经过填加空格和设置打印格式来调整便可。
for (i = 0; i < ROW; ++i) { for (k = ROW; k >= i; k--) {//添加空格的循环,空格数与行数恰好相反,第i行有ROW-i个空格。 printf(" "); } for (j = 0; j <=i; ++j) printf("%6d", a[i][j]);//设置打印格式,此处设置的是一个位置为6个字符显示的宽度 } printf("\n"); }
调整后的结果为:
方法二:用一维数组实现(此功能写成了一个函数)
用一维数组实现更加简洁方便,即赋好一层的值以后就打印该层,在赋值下一层的时候,前一层的数会被覆盖掉,但不影响结果,由于前一层 已经打印好了。如下为具体步骤:
1)创建一维数组
int a[ROW] = { 0 };//ROW和上面同理
2)赋值。一样的,第一层和第i层的第一个及最后一个都是1,较为特殊,需单独赋值处理,其他位置遵循规则(该数等于它上面的两数之和)用for循环赋值。
a)赋第一层并打印
a[0] = 1; printf(" %d \n", a[0]);
b)赋第i+1层的第一个和最后一个位置(用for循环)
for (i = 1; i < ROW; i++) { a[i] = 1;//第i+1层最后一个位置 a[0] = 1;//第i+1层第一个位置 }
c)赋其他位置(一样用for循环且嵌套在上一个循环内)
for (j = i-1; j > 0; --j) {//此处采用逆序赋值,从第i行倒数第二个开始 a[j] = a[j] + a[j - 1]; }
3)一行赋值完成后当即打印,这就要求打印放在第一个for循环里。
a)利用一个for循环便利便可(此处将该功能写成了一个函数)
void print_arr1(int a[], int n) { int i = 0; for (i = 0; i < n; ++i) { printf(" %d ", a[i]); } }
ps:记住每调用一次该函数,要加一句printf("\n");进行换行。
打印结果以下图,一样不太美观
b)一样经过填加空格和设置打印格式来调整便可
for (k = ROW; k >= 0; k--) {//用于打印第一行空格,加在第一行赋值后面。 printf(" "); } for (k = ROW; k >= i; k--) { printf(" ");//用于打印第i层的空格,加在第一层循环的赋值循环后。 } printf(" %3d", a[i]);//调整打印格式
调整后结果为:
#include<stdio.h> #include<stdlib.h> #define ROW 10 #define COL 10 void print_arr1(int a[], int n) { int i = 0; for (i = 0; i < n; ++i) { printf(" %3d", a[i]); } } //用一维数组实现 void print_yanghui() { int a[ROW] = { 0 }; int i,j,k; a[0] = 1; for (k = ROW; k >= 0; k--) { printf(" "); } printf(" %3d\n", a[0]); for (i = 1; i < ROW; i++) { a[i] = 1; for (j = i-1; j > 0; --j) { a[j] = a[j] + a[j - 1]; } a[0] = 1; for (k = ROW; k >= i; k--) { printf(" "); } print_arr1(a, i+1); printf("\n"); } } int main() { //二维数组实现 int a[ROW][COL] = { 0 }; int i,j,k; a[0][0] = 1; for (i = 1; i < ROW; ++i){ a[i][0] = 1; for (j = 1; j < i; ++j) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } a[i][i] = 1; } for (i = 0; i < ROW; ++i) { for (k = ROW; k >= i; k--) { printf(" "); } for (j = 0; j <=i; ++j) { printf("%6d", a[i][j]); } printf("\n"); } printf("\n\n\n\n\n"); //一维数组实现 print_yanghui(); system("pause"); return 0; }