212
社区成员
本题要求按照规定格式打印前N行杨辉三角。
输入在一行中给出N(1≤N≤10)。
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
对于这一题,初见可能会吓一跳,来来回回数着空格的多少,忘却了本质上题目的思考
依托题干,可以得知本题运用二维数组来求解
但是!问题来了,这玩意长得也不像个方阵啊?而且上下两行中间隔着若干个空格?这可咋整?
我们不妨先不管空格,把它左对齐
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
诶?你发现了什么?我们不妨手再贱一点
1 0 0 0 0 0
1 1 0 0 0 0
1 2 1 0 0 0
1 3 3 1 0 0
1 4 6 4 1 0
1 5 10 10 5 1
这玩意是不是就长得像二维数组了?
我们再思考一下数组中元素的关系我们不难看出一个公式
a [h] [l] = a [h-1] [l-1] + a [h-1] [l] ; (h,j>=1)
h,j为行和列的简写
还是没看懂?
在这里,根据这张图,我们可以得出上述普遍结论了a [h] [l] = a [h-1] [l-1] + a [h-1] [l] ; (h,j>=1)
即该位置的数由它的上边那个加上它左上角的那个
那么我们怎么算出各个位置上的数呢?总不能一个个手打吧?
我们不妨先利用原神高等元素论必修一当中的知识点把整个矩阵的所有元素全部初始化为0,然后再初始化第一列元素为1
再利用上述公式将剩下的数补全
但是!!!!!!!!!我们发现题目的输出不仅有很多byd空格,还没有输出byd0
这就对我们的格式化输出功底有所考察了
先解决不输出0的问题,然后再解决空格问题
直接上程序!
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n][n];
for(int h=0;h<n;h++)
for(int l=0;l<n;l++)
a[h][l]=0; //初始化byd0
for(int h=0;h<n;h++)
a[h][0]=1; //初始化第一列byd1
for(int h=1;h<n;h++)
for(int l=1;l<n;l++)
a[h][l]=a[h-1][l-1]+a[h-1][l]; //补全byd杨辉三角
int k=n-1;
for(int h=0;h<n;h++){
for(int i=0;i<n-(n-k);i++)
printf(" "); //输出byd空格
for(int l=0;l<n-k;l++){ //输出byd数字
printf("%4d",a[h][l]);
if(k<0)
break;
}
k--;
printf("\n");
}
}
非常好作业报告,使我杨∠放缩
非常好报告,使我数组转置
很好报告,使我的滨州炸裂
很好报告,使我的数组旋转