【C语言练习——打印杨辉三角及其变形】

CSDN话题挑战赛第1期
活动详情地址:活动地址
参赛话题:大学学习月/季度总结
话题描述:对自己大学的月/季度学习的复盘及展望


杨辉三角及其变形

  • 前言
  • 1、杨辉三角之左对齐
    • 1.1 写法1
    • 1.2 写法2
    • 1.3 写法3
  • 2、杨辉三角之右对齐
  • 3、杨辉三角之中间对齐
  • 总结

前言

本文主要是写关于杨辉三角的练习题,杨辉三角的介绍见百度百科:

【C语言练习——打印杨辉三角及其变形】_第1张图片【C语言练习——打印杨辉三角及其变形】_第2张图片

在屏幕上打印杨辉三角,杨辉三角的两个特点:
1、元素等于上一行特定位置的两个元素之和
2、每一行的第一列和最后一列都是1

例如:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
……

1、杨辉三角之左对齐

1.1 写法1

//杨辉三角
int main()
{
	int arr[7][7] = { 0 };
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if (j == 0)//第一行第一列的元素是1
			{
				arr[i][j] = 1;
			}
			if (j == i)//行列相等时,输出1
			{
				arr[i][j] = 1;
			}
			if ((i >= 2) && (j >= 1))//元素是上一行对应两位置的元素之和
			{
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
			}
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

1.2 写法2

int main()
{
	int a[7][7] = { 1 }; //初始化为1
	int i = 0;
	int j = 0;
	for (i = 1; i < 7; i++) //从第二行开始
	{
		a[i][0] = 1; //每行的第一列都是1。
		for (j = 1; j <= i; j++) //从第二列开始
		{
			a[i][j] = a[i - 1][j] + a[i - 1][j - 1]; //元素是上一行对应两位置的元素之和
		}
	}
	for (i = 0; i < 7; i++) //打印
	{
		for (j = 0; j <= i; j++)
		{
			printf("%d ", a[i][j]);
		}
		putchar('\n');
	}
}

1.3 写法3

int main()
{
	int a[7] = { 1 };
	int i, j;
	printf("1\n"); //第一行就直接打印了
	for (i = 1; i < 7; i++) //从第二行开始
	{
		for (j = i; j > 0; j--) //从后向前填,避免上一行的数据在使用前就被覆盖
		{
			a[j] += a[j - 1]; //公式同上,由于变成了一维,公式也变简单了。
		}

		for (j = 0; j <= i; j++) //这一行填完就直接打印了。
		{
			printf("%d ", a[j]);
		}
		putchar('\n');
	}
}

3种方法的结果一样,见下图所示:

【C语言练习——打印杨辉三角及其变形】_第3张图片
其中方法3 难以想到,代码定义了一维数组,调试过程见下图:

【C语言练习——打印杨辉三角及其变形】_第4张图片

2、杨辉三角之右对齐

//右对齐 
int main()
{
	int arr[7][7] = { 0 };
	for (int i = 0; i < 7; i++)
	{
		if (i>=0 && i < 5)
		{
			for (int k = 0; k < 15 - 2 * i; k++)
			{
				printf(" ");
			}
		}
		if (i >= 5 && i < 6)
		{
			for (int k = 0; k < 15 - 2 * i-2; k++)
			{
				printf(" ");
			}
		}
		
		for (int j = 0; j <= i; j++)
		{
			if (j == 0)//第一列的元素都是1
			{
				arr[i][j] = 1;
			}
			if (j == i)//行列相等时,输出1
			{
				arr[i][j] = 1;
			}
			if ((i >= 2) && (j >= 1))//元素是上一行对应两位置的元素之和
			{
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
			}
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

写完才意识到代码不具有通用性,个位数、两位数、三位数所占的位数不同,蚌埠住了(实际上是不知道搞了emo)。

但是写都写了,硬着头皮也要上代码,结果见下图,求轻喷:

【C语言练习——打印杨辉三角及其变形】_第5张图片

3、杨辉三角之中间对齐

//右对齐 
int main()
{
	int arr[7][7] = { 0 };
	for (int i = 0; i < 7; i++)
	{
		for (int k = 0; k < 7-i-1;k++ )
		{
			printf(" ");
		}
		for (int j = 0; j <= i; j++)
		{
			if (j == 0)//第一列的元素都是1
			{
				arr[i][j] = 1;
			}
			if (j == i)//行列相等时,输出1
			{
				arr[i][j] = 1;
			}
			if ((i >= 2) && (j >= 1))//元素是上一行对应两位置的元素之和
			{
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
			}
			printf("%d ", arr[i][j]);
		}
		printf("\n");	
	}
	return 0;
}

结果见下图,由于个位数和两位数占位不同,看最后一列可观察到,实际并不是中间对齐,还凑合着看吧(实际上也是不知道搞了emo):

【C语言练习——打印杨辉三角及其变形】_第6张图片


总结

左对齐、右对齐、中间对齐是word等文档里常用到的对齐格式。

本文是杨辉三角的练习题,代码写的比较啰嗦,而且限制了数组的维度,代码不具有通用性。等后续学习得深入再进行修改,也请大佬们能够指点一下。

C语言还是要多练习,多看别人的代码。

CSDN话题挑战赛第1期
活动详情地址:活动地址

你可能感兴趣的:(C知识点的练习题,c语言,开发语言,学习)