给定一个正整数N,要求打印出N行的杨辉三角形。
分析:
整个杨辉三角形可以放到一个二维数组中,数字与数字之间的间隙可以看成当作一个0放在数组中。如果我们输出杨辉三角形前4行,那么每行需要的数组长度(也就是最后一行第四行需要的数组长度)为2*4-1=7,以此类推,如果是输出杨辉三角形前30行,我们通过规律可知第30行需要的数组大小为2*30-1=59.因为杨辉三角形每个数字都等于上一行左右两个相邻数字之和,而我们又把数组中的每个元素都赋值为0,所那么我们只给出第一行的1在数组中的位置即可。
代码及运行结果如下:
#include <stdio.h>
#define N 4 //这里用宏定义指定要打印的行数,使程序更灵活,可改性强
int main()
{
int i,j,n,count_null;
int a[30][59]={0};//初始化数组所有元素为0
if(N==1)//如果要求打印1行杨辉三角形,这里直接输出,然后用“return 0;”结束程序运行,后面的代码不在执行
{
printf("1");
return 0;
}
for(i=0;i<N-1;i++)//接下来这3行将打印杨辉三角形的第一行
printf(" ");
printf("1");
a[0][N-1]=1;//这里把杨辉三角形第一行的那个数字1存放在数组中指定的位置
for(i=1;i<N;i++)//接下来从第二行开始逐行打印杨辉三角形
{
printf("\n");//每次循环开始前换行,所以之前在打印杨辉三角形第一行的时候并没有换行
n=0;
count_null=0;
for(j=N-i-1;j>0;j--)//这个for循环的作用是打印这一行第一个数字前的空格
{
printf(" ");
count_null+=1;//记录打印的空格数
}
for(j=count_null;j<2*N-1;j++)//注意这个j的初始赋值,此时初始位置应该是上个打印空格for循环结束后的位置,而又因为数组从0开始,所以这里j的初始值不是count_null+1
{
if((a[i-1][j-1]!=0)||(a[i-1][j+1]!=0))//如果上一行这两个位置有一个是非零数,就输出数字
{
a[i][j]=a[i-1][j-1]+a[i-1][j+1];
printf("%d",a[i][j]);
}
else//否则,输出空格
{
printf(" ");
n+=1;//此处要记录打印的空格数,下面的if语句会用到
}
if(((count_null+n)==N-1)&&(a[i][j]!=0))//通过观察杨辉三角形,可以发现如果要打印N行,那么这N行中的每一行最后一个数字前都会有N-1个空格
{ //所以满足这个条件,就可以提前结束循环
break;
}
}
}
return 0;
}
运行结果:
上面的代码有一定局限性,如果打印的行数超过6行,这是会出现十位数,输出结果看上去就不准确,比如下图,杨辉三角形左右就不是非常对称
那我们可以通过加\t的方式代替之前出现的所有空格。注意代码31行的输出后面也要加\t,
#include <stdio.h>
#define N 8 //这里用宏定义指定要打印的行数,使程序更灵活,可改性强
int main()
{
int i,j,n,count_null;
int a[30][59]={0};//初始化数组所有元素为0
if(N==1)//如果要求打印1行杨辉三角形,这里直接输出,然后用“return 0;”结束程序运行,后面的代码不在执行
{
printf("1");
return 0;
}
for(i=0;i<N-1;i++)//接下来这3行将打印杨辉三角形的第一行
printf("\t");
printf("1");
a[0][N-1]=1;//这里把杨辉三角形第一行的那个数字1存放在数组中指定的位置
for(i=1;i<N;i++)//接下来从第二行开始逐行打印杨辉三角形
{
printf("\n");//每次循环开始前换行,所以之前在打印杨辉三角形第一行的时候并没有换行
n=0;
count_null=0;
for(j=N-i-1;j>0;j--)//这个for循环的作用是打印这一行第一个数字前的空格
{
printf("\t");
count_null+=1;//记录打印的空格数
}
for(j=count_null;j<2*N-1;j++)//注意这个j的初始赋值,此时初始位置应该是上个打印空格for循环结束后的位置,而又因为数组从0开始,所以这里j的初始值不是count_null+1
{
if((a[i-1][j-1]!=0)||(a[i-1][j+1]!=0))//如果上一行这两个位置有一个是非零数,就输出数字
{
a[i][j]=a[i-1][j-1]+a[i-1][j+1];
printf("%d\t",a[i][j]);
}
else//否则,输出空格
{
printf("\t");
n+=1;//此处要记录打印的空格数,下面的if语句会用到
}
if(((count_null+n)==N-1)&&(a[i][j]!=0))//通过观察杨辉三角形,可以发现如果要打印N行,那么这N行中的每一行最后一个数字前都会有N-1个空格
{ //所以满足这个条件,就可以提前结束循环
break;
}
}
}
return 0;
}
这个代码的运行结果如下:
当然,如果觉得数与数之间的间隙过大,可以用多个空格(空格数一定是奇数个,比如1,3,5…否则也会不对称)代替所有的\t