深夜手撕三角

在c语言中会用for循环干很多很多事情,今天要分享大家的是通过for循环打印出两个靠在一起的三角形,那我为什么不说是菱形呢?嘿嘿,我在点题呀,还有就是著名的杨辉三角问题

深夜手撕三角_第1张图片

杨辉三角

杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。

怎么用c语言实现杨辉三角呢???
深夜手撕三角_第2张图片
图1

这个是最后要实现的效果。
如果我去掉打印中的空格的话,是下面的效果
深夜手撕三角_第3张图片
图3

数字的位数可能不一样看不太清楚,如果每个数字都一样是怎么样的??
深夜手撕三角_第4张图片
图4

从这里可以看出我们可以把数据放在一个二维数组里面。比如打印出图4那样
int main()
{
int arr[10][10] = { 0 };
int i = 0;

for (i = 0; i <10; i++)
{
	int j=0;
	
	
	for (j = 0; j <=i; j++)    //这里j<=i就是为了打印主对角线下方的数据
	{
		printf("%d ", arr[i][j]);
	}
	printf("\n");
}

}
根据图3可知二维数组的第一列都是1,主对角线也都是1,代码实现如下

int main()
{
int arr[10][10] = { 0 };
int i = 0;

for (i = 0; i < 10; i++)
{
	int j = 0;
	for (j = 0; j < 10; j++)
	{
		if(j == 0)//如果是第一列赋值为1
		{
			arr[i][j] = 1;
		}
		if (i==j)//如果是主对角线赋值为1
		{
			arr[i][j] = 1;
		}
	
    }

}
for (i = 0; i <10; i++)
{
int j=0;

	for (j = 0; j <=i; j++)
	{
		printf("%d ", arr[i][j]);
	}
	printf("\n");
}

}
打印结果如下
深夜手撕三角_第5张图片
但是这个图片和图三还有差异,对比发现,要实现杨辉三角的数据的话,

深夜手撕三角_第6张图片

下面这个红圈的数据应该是上面红圈两个数据的和也就是arr[2][1]=arr[1][1]+arr[1][0];

arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];`
int main()
{
	int arr[10][10] = { 0 };
	int i = 0;

	for (i = 0; i < 10; i++)
	{
		int j = 0;
		for (j = 0; j < 10; j++)
		{
			if(j == 0)
			{
				arr[i][j] = 1;
			}
			if (i==j)
			{
				arr[i][j] = 1;
			}
			if (i >= 1 && j >= 1)
			{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
		
        }
}
	for (i = 0; i <10; i++)
	{
		int j=0;
		
		
		for (j = 0; j <=i; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

现在才得到了图三的结果,为了出现三角的形状,开始加空格,
在每一行打印前加空格,每行的空格数递减,我们可以通过循环实现

int main()
{
	int arr[10][10] = { 0 };
	int i = 0;

	for (i = 0; i < 10; i++)
	{
		int j = 0;
		for (j = 0; j <=i; j++)
		{
			if (j == 0)
			{
				arr[i][j] = 1;
			}
			if (i == j)
			{
				arr[i][j] = 1;
			}
			if (i >= 1 && j >= 1)
			{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];

			}
		}
	}
		for (i = 0; i < 10; i++)
		{
			int j = 0;
			for (int k = 0; k < 10 - i; k++)//循环打印空格,空格数随着行数递减,i越大循环次数越小,打印空格越少,最后保证在最后一行i=9时,前面有一个空格,这里的循环判断可以写k < 10 - i
		{
			printf("  ");//两个空格
		}

			for (j = 0; j <=i; j++)
			{
				printf("%3d", arr[i][j]);
			}
			printf("\n");
		}
	}
	printf("  ");//两个空格
```c
在这里插入代码片
printf("%3d ", arr[i][j]);

这样打印的话会好看一点

# 打印菱形

![在这里插入图片描述](https://img-blog.csdnimg.cn/41cfb3f89f6c4c389ffe4684d3c659fa.png#pic_center)

这个菱形的打印我们可以分为上半部分和下半部分,可以从键盘输入上面的三角为n行,而下面的三角则为n-1行,我们先实现上半部分

```c
int n = 0;

	scanf_s("%d", &n);//通过键盘输入n行

	for (int i = 1; i <= n; i++)//循环遍历每一行

	{

		int j = 0;

		for (j = 0; j < n - i; j++)//为了使上半部分最后一行刚好与左边界对齐,循环判断条件为j < n - i当i==n时刚好打印空格的循环不进行循环,从第一行往下每一行少打印一个空格

		{

			printf(" ");



		}

		for (int k = 0; k < 2 * i - 1; k++)//打印*,观察规律打印*次数与行数有关,i为行数,*的数目为2*i-1

		{

			printf("*");

		}

		printf("\n");每一行结束打印换行


	}

深夜手撕三角_第7张图片

输入n=7,上半部分七行,
下面的n-1行用类似的方法
、`for (int i = 1; i <= n - 1; i++)//循环遍历下部分n-1行

{

	int j = 0;

	for (j = 0; j < i; j++)//为了和上面对称,并且空格的数目递增,1, 2 ,3这样增加,可以把循环条件与i联系起来,i每次jia1,j就可以多循环1次,多打印一个空格,循环判断条件可以写成j < i

	{

		printf(" ");



	}

	for (int q = 0; q < 2 * (n - 1 - i) + 1; q++)//根据下面打印的结果,下面第一行打印的应该是11个*,n=7,n-1=6,打印的次数为2*(n-1)-1吗??因为打印的*的次数每一行时变化的,所以应该和i这个变化的行数结合起来,下面第一行i=1;这一行打印了2*(n-1-i)+1次,

	{

		printf("*");

	}

	printf("\n");

}

深夜手撕三角_第8张图片
整体代码

int main()

{

	int n = 0;

	scanf_s("%d", &n);

	for (int i = 1; i <= n; i++)

	{

		int j = 0;

		for (j = 0; j < n - i; j++)

		{

			printf(" ");



		}

		for (int k = 0; k < 2 * i - 1; k++)

		{

			printf("*");

		}

		printf("\n");

	}


	for (int i = 1; i <= n - 1; i++)

	{

		int j = 0;

		for (j = 0; j < i; j++)

		{

			printf(" ");



		}

		for (int q = 0; q < 2 * (n - 1 - i) + 1; q++)

		{

			printf("*");

		}

		printf("\n");

	}}

通过for循环可以打印好多好看的图案,除了上面的三角图案,希望大家多多支持,如果有不对的地方,请大佬多多指教,谢谢大家了

你可能感兴趣的:(c语言)