通常使用在实现杨辉三角时使用的时使用二维数组的方式,这种方式比较快捷,且比较好理解,但是使用二维数组浪费了大量的空间,又大概一般的空间未被使用。如果使用一维数组进行计算能大大提高空间利用率。
首先我们定义一个函数用来计算任意行数杨辉三角需要使用到的数组长度。并且可以通过这个函数能够找到上一行杨辉三角的起始位置。
#include <stdio.h>
int len(int);
int main(void){
int floor;
int length;
int index_top_begin,index_pre_begin;
printf("输入要打印多少层:");
scanf("%d",&floor);
if(floor<0){
printf("输入错误\n");
return 0;
}
length=len(floor);
printf("申请长度:%d\n",length);
int num[length]; //通过计算出的长度申请数组
for(int i=0;i<floor;i++){
if(i==0){ //第一行固定为1
num[0]=1;
}
else{
index_top_begin=len(i-1); //计算当前行的上一行的数据是从哪个索引开始的
index_pre_begin=len(i); //计算当前行的数据是从哪个索引开始的
// printf("%d %d %d\n",i,index_top_begin,index_pre_begin);
num[index_pre_begin]=num[index_pre_begin+i]=1;//剩下的所有行首尾都是1
for(int j=1;j<i;j++){
num[index_pre_begin+j]=num[index_top_begin+j-1]+num[index_top_begin+j];//循环计算当前行的值
}
}
}
//打印杨辉三角
for(int i=0;i<floor;i++){
int index=len(i);
for(int j=0;j<floor-i;j++){
printf(" ");
}
for(int j=index;j<=index+i;j++){
printf(" %d ",num[j]);
}
printf("\n");
}
printf("\n");
return 0;
}
//定义函数,计算杨辉三角第n行往前所有行的数据量
int len(int floor){
int len;
len=(floor*floor+floor)/2;
return len;
}
在打印时也对每行需要空出来的长度做了处理,尽量保证打印出来的是一个三角形