二维数组-杨辉三角
题目描述
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
上面的图形熟悉吗?它就是我们中学时候学过的杨辉三角。
输入
一个正整数 n (1≤n≤30),表示将要输出的杨辉三角的层数。
输出
输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开。
输入
4
输出
1
1 1
1 2 1
1 3 3 1
#include<stdio.h>
int main()
{
int a[100][100]={0};
int n;
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++){
a[i][0]=1;
a[i][i]=1;
for(j=1;j<i;j++){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
这道题思路很清晰,主要错误点:
一开始没有使数组从0开始记下标。
不知道应该把a[0][0]=1放在哪里,一开始放在了循环外面,只是定义第一行的第一个数字,但其实每一行的第一个数字都是1,所以可以把它放在循环里,照样可以被后面利用a[0][0]=1.因为a[i][i]=1和a[i][0]=1是相同的条件,而且都只与i有关,所以可以放在一块,都放在i循环里边,j循环外边。j循环是两个1里边的内容。
也可以写成下面这种形式。
if(i==j||j==0){
a[i][j]=1;
}else{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
下面的代码,就是我第一次思考写的代码。数组下标没有从0开始,所以会导致每一行的第一个数字为0,除了第一行。同时,把a[1][1]=1放在外面,无法保证每一行的第一个数字是1。因为无法确保第一行的第二个数字是0,所以在计算的时候,不知道是多少,可能会出现垃圾值。(a[i-1][j]=a[0][1]不知道为何值。
上述代码更简洁,更符合一种语言。
int i,j;
a[1][1]=1;
for(i=2;i<=n;i++){
for(j=2;j<=i;j++){
if(i=j){
a[i][j]=1;
}else{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
出现输出下述情况:
1
0 1
0 1 1
0 1 2 1

浙公网安备 33010602011771号