题目
打印出杨辉三角形的前十行
第1行: 1
第2行: 1 1
第3行: 1 2 1
第4行: 1 3 3 1
第5行: 1 4 6 4 1
第6行: 1 5 10 10 5 1
第7行: 1 6 15 20 15 6 1
第8行: 1 7 21 35 35 21 7 1
第9行: 1 8 28 56 70 56 28 8 1
第10行: 1 9 36 84 126 126 84 36 9 1
我的代码
#include<stdio.h>
int main(){
int yangh[10][11];
int i,j;
for(i=0;i<10;i++){
for(j=0;j<11;j++){
yangh[i][j] = 0;
}
}
for(i=0;i<10;i++){
yangh[i][0] = 1;//先确保每一行的开头和末尾都是1
yangh[i][i] = 1;
for(j=0;j<10;j++){
if(i>0){
yangh[i][j+1] = yangh[i-1][j] + yangh[i-1][j+1];//发现每一行的数值除了开头和末尾就是上一行的数值两两相加
}
}
}
for(i=0;i<10;i++){
for(j=0;j<11;j++){
if(j<i+1){ //这里还可以直接在for循环里改,j<i之类的这种
printf("%d\t",yangh[i][j]);
}
}
printf("\n");
}
return 0;
}
改进代码
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10][10] = {{0}};
int i, j;
for (i = 0; i < 10; i++) {
a[i][0] = 1;
for (j = 1; j <= i; j++)
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
for (i = 0; i < 10; i++) {
for (j = 0; j <= i; j++)
printf("%-8d ", a[i][j]);
putchar('\n');
}
return 0;
}
输出结果
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
问题和解决
1、编写过程中由于没有在一开始就初始化,所以出现了很多随机数,在这中间可能是出现了垃圾值,导致我第一行一直输出两个1(实际上是一个1):
后面初始化并改写输出格式以后结果就正确了。
2、在for循环时,要学会更改循环结束的位置以简化循环过程,比如我这次写的代码里:
for(j=0;j<10;j++){
if(i>0){
yangh[i][j+1] = yangh[i-1][j] + yangh[i-1][j+1];//发现每一行的数值除了开头和末尾就是上一行的数值两两相加
}
其实这里的j<10可以改为j<i,因为i以后的位置不需要再进行赋值。
3、在编写输出格式时可以用上类似于%-8d这种让输出结果变得美观的符号,%-8d 中的 - 表示左对齐,8 表示输出的最小宽度为 8 个字符(包括数字和可能的负号),如果数字不足 8 位,会在右侧填充空白字符使其达到宽度。