杨辉三角的几种解决方法(c语言)

杨辉三角的几种解决方法(c语言)

在这里插入图片描述

以下为直角三角形图案样式
1.二维数组法(前提是您对二维数组或者是杨辉三角有一定的了解)

#include <stdio.h>
int main()
{
    int a[100][100];//定义一个二维数组,用以储存数据
    int i,j;//i定义为行,j定义为列
    int n;
    scanf("%d",&n);//输入层数
    for(i=0;i<n;i++)
    {
    	for(j=0;j<=i;j++)
    	{
    		if(j==0 || i==j)//在第一列或者在对角线上
    		{
    			a[i][j]=1;//每一行的两端,即开头均为1
    		}
    		else
    		{
    		    /*此步可通过数字图形找到规律,也是杨辉三角的一条基本性质*/
    			a[i][j]=a[i-1][j]+a[i-1][j-1];
    		}
    	}
    }
    //输出杨辉三角
    for(i=0;i<n;i++)
    {
    	for(j=0;j<=i;j++)
    	{
    		printf("%d ",a[i][j]);
    	}
    	printf("\n");
    }    
}

2递归(一些较大数据的运行时间远远多于其他方法)

#include <stdio.h>
int f(int x,int y)
{
  if(y==0||x==y) return 1;//x代表行,y代表列
  else
  {
    return(f(x-1,y-1)+f(x-1,y));
  }
  
}
int main()
{
  int i,j,n;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    for(j=0;j<=i;j++)
   {
     printf("%d ",f(i,j));
   }
    putchar('\n');
  }
   
   return 0;
}

3阶乘法(基于杨辉三角的性质,即组合数问题)

#include <stdio.h>
#define ll  float//ll可更改为其他形式
ll j(int n)
{
    ll sum=1,i;
    if(n==0) return 1;
    else
    {
        for( i=n;i>1;i--)
        sum=sum*i;
        return sum;
    }
}
ll c(int x,int y)//中学所学的组合数
{
    return j(y)/(j(x)*j(y-x));
}
int main()
{
   int h,i,j;
   scanf("%d",&h);
   for(i=1;i<=h;i++)
   {
       for(j=1;j<=i;j++)
            printf("%.0f ",c(j-1,i-1));
    putchar('\n');
   }
   return 0;
}

以下为正三角形图案样式

#include <stdio.h>
int main()
{
    int s = 1, h;                    // 数值和高度
    int i, j;                        // 循环计数
    scanf("%d", &h);                 // 输入层数
    for(i=1;i<=2*(h-1);i++)//为第一行的‘1’空出空格
    putchar(' ');
    printf("1\n");                   // 输出第一个 1
    for (i = 2; i <= h; s = 1, i++)         // 行数 i 从 2 到层高
    {
        for(j=1;j<=2*(h-i);j++)//为每一行的‘1’前面空出空格
        putchar(' ');
        printf("1   ");                // 第一个 1,每两个数字之间相隔三个单位空间
        for (j = 1; j <= i - 2; j++)// 列位置 j 绕过第一个直接开始循环,即从i=3,j=1时从第三行开始输出每一行的第二项之后的数
        {
            s=(i-j)*s/j;//套用公式
            printf("%d   ", s);
        } 
        printf("1\n");               // 最后一个 1,换行
    }
    //getchar();                       // 暂停等待
    return 0;
}

以上为本人所想到的方法,如有出错之处,请您立刻通知本人,本人将以感激的态度接受您的指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值