杨辉三角

题目描述

还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:

1 1 

1 2 1 

1 3 3 1 

1 4 6 4 1 

1 5 10 10 5 1

输入

输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数。

输出

对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。

样例输入

2 
3

样例输出

1
1 1

1
1 1
1 2 1

题意简洁明了,就是要我们输出n层的杨辉三角,我们直接开个n*n大小的二维数组,然后写个循环去算就是了。需要注意的地方有几个,一是我们写的时候直接用0将三角的空位补齐,在输出的时候跳过0输出就行,例如这样,补成一个方阵:

1 0 0
1 1 0
1 2 1

第二个要注意的点就是写代码的时候我们先用0填充数组的所有位置,然后把全是 1 的第一列先写个循环处理。之后核心的逻辑就是(i,j) = (i-1,j-1) + (i-1,j),其中i是行数,j是列数,我们先设0的目的就是为了这里写起来方便简洁,不用再处理越界的问题,但是需要注意计算杨辉三角的二层循环的行号和列数必须从1开始。

贴一下代码,已在OJ上AC:

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

int main(){

	int n;
	while(scanf("%d",&n) != EOF){
		int arr[n][n];
		//双重循环一并把清零和初始化1的操作完成 
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(j==0){
					arr[i][j] = 1;
				}
				else{
					arr[i][j] = 0;
				}
				
			}
		}
		
		for(int i=1;i<n;i++){
			//此处j<i+1是为了补上我们初始设置int j=1时跳过的一个位子 
			for(int j=1;j<i+1;j++){
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
			}
		}
		
		//输出时跳过0 
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(arr[i][j] == 0){
					continue;
				}
				printf("%d ",arr[i][j]);
			}
			printf("\n");
		}
		printf("\n");
	}
	
	return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章