二维数组-杨辉三角

题目描述

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

 

posted @ 2025-12-04 23:06  代码无bug抓狂者  阅读(16)  评论(0)    收藏  举报