杨辉三角形特点是每个元素都等于它正上方与左上方数之和,于是可以计算出除第一列第一行外的所有元素
以前都是输出定维数的杨辉三角,现在想想万一要输出任意维数的杨辉三角。
用传统的二维数组来存放杨辉三角是行不通的(C语言不允许使用变量当做数组的维数,int a[n][n],是行不通的),所以想到了使用动态开辟空间malloc和calloc,自己来做一个二维数组,甚至是一个n为数组。
int **p=(int **)calloc(1,sizeof(int)*n);
int *p=(int *)calloc(1,sizeof(int)*n);
动态开辟一个二级指针,且p为指向一个二维数组,且每一行的类型为int[n],相当于n个int型的数据,也就相当于一个int[n]类型的一维数组。
*(p+i)=(int *)calloc(1,sizeof(int)*n);
对该二位数组的第二维开辟n个int型的空间
/***********************************************************/
/* 输出n维杨辉三角 */
/* 作者:Darges */
/***********************************************************/
#include<stdio.h>
#include<stdlib.h>
void YH_triangle(int n);
void main()
{
int i;
printf("输出N维杨辉三角:");
while(scanf("%d",&i)&&i!=0)
{
YH_triangle(i);
printf("输出N维杨辉三角:");
}
}
void YH_triangle(int n)
{
int i,j;
int **p=(int **)calloc(1,sizeof(int)*n); //动态开辟一个二维数,或者说开辟一个 类型为int[n] 的一维数组
for(i=0;i<n;i++)
{
*(p+i)=(int *)calloc(1,sizeof(int)*n); //对该二位数组的第二维开辟n个int型的空间
*(*(p+i))=1;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i>0&&j>0)
{
p[i][j]=p[i-1][j-1]+p[i-1][j]; //杨辉三角你懂得,用数组的运算形式对元素操作,用指针的话不直观
}
if( (*(*(p+i)+j))!=0 )
{
printf("%-5d",*(*(p+i)+j)); //非0的输出
}
}
printf("\n");
}
for(i=0;i<n;i++)
{
free(*(p+i)); //记得释放内存
}
}
总的来说多维数组在C语言里面都可以看作是降维之后的一维数组,对于二维数组而言int a[10][5],就相当于 int[5] a[10];,数组其实就是一个结构类型,int[10]也可以当做一个类型,把它当做一个大元素。这样编译器就能识别N维数组。
记得释放内存