题目描述
还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
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),表示将要输出的杨辉三角的层数。
输出
对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。
样例输入
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;
}