法1:
常见方法:
由d[i][j] = d[i - 1][j] + d[i - 1][j - 1]
创建数组利用双for循环达成代码
#include<stdio.h>
int main()
{
int a[10][10] = {0};
int i = 0, j = 0, k = 0;
for (k = 0; k < 10; k++)
{
a[k][0] = 1;//使每列全为1
}
for (i = 1; i < 10; i++)
{
for (j = 1; j <= i; j++)
{
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
return 0;
}
结果如下:
发现此方法打印行数确定修改较为困难且有0数字
采用函数方法优化代码!!!
法2:
运用函数:
void yangHuiTriangle(int n)
{
int data[30][30] = { 1 }; //第一个元素为1,其余为0
int i, j;
for (i = 1; i < n; i++) //从第二行开始填
{
data[i][0] = 1; //每行的第一列都没有区别,直接给1,保证不会越界。
for (j = 1; j <= i; j++) //从第二列开始填
{
data[i][j] = data[i - 1][j] + data[i - 1][j - 1]; //递推
}
}
for (i = 0; i < n; i++) //打印
{
for (j = 0; j <= i; j++)
{
printf("%d ", data[i][j]);
}
printf("\n");
}
}
int main()
{
int a = 0;
scanf("%d", &a);
yangHuiTriangle(a);
return 0;
}
结果如下:
则可以改动需要打印行数,数0也除去了!
改进:
由于我在填第n行的杨辉三角时,只跟第n-1行的杨辉三角产生联系,不会跟之前的有联系,所以没必要保存每一行的杨辉三角,填一行打一行就行了,这样能让空间复杂度从n^2降低到n。但是在填数据的时候不能对之前的数据覆盖,所以需要从后向前填。而填杨辉三角顺序对结果是没有影响的,所以可以实现。
代码如下:
void yangHuiTriangle(int n)
{
int data[30] = { 1 };
int i, j;
printf("1\n"); //第一行就直接打印1
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]);
}
printf("\n");
}
}
int main()
{
int a = 0;
scanf("%d", &a);
yangHuiTriangle(a);
return 0;
}
结果同上:
杨辉三角问题就解决啦!!!