打印N维杨辉三角,动态二维数组

杨辉三角形特点是每个元素都等于它正上方与左上方数之和,于是可以计算出除第一列第一行外的所有元素

以前都是输出定维数的杨辉三角,现在想想万一要输出任意维数的杨辉三角。

用传统的二维数组来存放杨辉三角是行不通的(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维数组。

记得释放内存

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值