• 大意

杨辉三角是二项式系数在三角形中的一种几何排列 如上图所示,每一行的第一个和最后一个都是1,每个数等于它上方两个数之和。 编写代码在屏幕上打印如图所示杨辉三角(不包括图中n那一列)

  • 思路

方法一:用二维数组实现 用二维数组打印杨辉三角问题与打印乘法表类似,第一个[ ]表示打印的行数,第二个[ ]表示打印的列数,再用两层for循环遍历,给每一个元素赋相应的值。赋好值之后,再用两层for循环遍历进行打印出来。以下是具体步骤:

1)建立二维数组(此处举例为a[ ][ ]),并设好下标(即打印的杨辉三角层数)。此处建议使用宏定义,方便以后修改层数。

#define ROW 10
#define COL 10

ps:此处举例,打印的是10层,若想打印更多(少),直接改10就行。杨辉三角的行数与列数是相等的,如果宏定义的值不相等,打印结果是有问题的。

2)建立好数组后开始赋值。我们发现杨辉三角第一层和以后每一层的第一个数及最后一个数都是1,这是固定不变的,因此这些特殊的位置需要单独赋值。其他的位置通过规律(该数等于它上方两数之和)用for循环进行赋值即可。

a)第一层可直接赋值为1。

a[0][0] = 1;  //第一层在数组里下标为0

b)第一层赋好之后,用for进行其余层的第一个和最后一个的赋值。

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循环里)搞定

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)打印该二位数组。

a)用两层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;
}
  • 运行结果