杨辉三角形

杨辉三角形

所属专栏:脑筋急转弯❤️
>博主首页:初阳785❤️
>代码托管:chuyang785❤️
>感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
>博主也会更加的努力,创作出更优质的博文!!❤️
>关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️

#杨辉三角形:
杨辉三角形_第1张图片
方法一:

由上面的图形分析规律我们可以发现,设行为i列为j,这明显是一个二维数组,当行=列或者列=0的时候数据都是等于1的
而且arr[i][j]==arr[i - 1][j - 1] + arr[i - 1][j]
杨辉三角形_第2张图片
而且我么打印的时候并不是将每个数都打印出来,而是打印一半:
代码展示:

int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[100][100] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		int j = 0;
		for (j = 0; j < n; j++)
		{
			if (i == j || j == 0)
				arr[i][j] = 1;
			else
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];

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

方法2:
我们会发现上述的代码的时间复杂度是n^2。 由于我在填第n行的杨辉三角时,只跟第n-1行的杨辉三角产生联系,不会跟之前的有联系,所以没必要保存每一行的杨辉三角,填一行打一行就行了,这样能让空间复杂度从n ^2降低到n。但是在填数据的时候不能对之前的数据覆盖,所以需要从后向前填。而填杨辉三角顺序对结果是没有影响的,所以可以实现。
于是我们就可以创建一个一维数组,同时把第一个数据初始化为1.
杨辉三角形_第3张图片
代码展示:

int main()
{
	int n = 0;
	scanf("%d", &n);
	int data[30] = { 1 };

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

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

你可能感兴趣的:(#,“,脑筋急转弯,”,c语言)