题目描述
还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
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
解答:
这个题我一看,霍,做过,大概思路就是先把第0列的全为1,再把每一行末尾全为一,然后中间的那个数字是前一行的两个数相加所得。
我想了一下,这个用三个for是最快的,因为在中间和两边的i和j的起始位置都不一样,但我看这个还要考虑到连续输入,所以只能用while(scanf)来进行大的并归。
#include<stdio.h> #include<math.h> int main(){ int a[30][30] ; int i,j,num; while(scanf("%d",&num) != EOF){ a[0][0] = 1; for(i = 1;i < num;i++){ for(j = 0;j < i+1;j++){ if(j == i){ a[i][j] = 1; }else if(j == 0){ a[i][j] = 1; }else{ a[i][j] = a[i-1][j-1]+a[i-1][j];//从第三行,第二列开始 } } } for(i = 0;i < num;i++){ for(j = 0;j < i+1;j++){ printf("%d ",a[i][j]); } printf("\n"); } printf("\n"); } return 0;}
这个程序是参考别人的,这个程序牛在哪里,牛在三个地方。
1.真正的用while进行了全面包括,包括数据处理和输出,小细节处理的也不错,换行很到位。
2.在开始先把00处赋值,后面直接从第一行进行处理,j也加了一,很妙
3第三个else处,i是从第二行开始的,j也是从第一数列走起来的的,用了一个向回推的方法,此处需要注意!!!我这改成了a[i+1][j+1]=a[i][j+1]+a[i][j];结果好像溢出了。思想从此往回推即可,不要瞎搞。
心得,题目和学习知识还是有点区别,大家要多做题来过度。