C语言 - 四种方法解决杨辉三角问题(数学规律、一维数组、二维数组、递归)

目录

引言:

分析:

方法一:利用数学规律(前五行)

方法二:利用二维数组

 方法三:利用一维数组

方法四:利用递归

参考资料:


引言:

杨辉三角是一个经典的数学问题,也是我在学习C语言过程中结合条件判断语句和循环语句的一个经典题目,在之前系统的学习二维数组时曾经使用二维数组对这个程序进行过编写,但经过思考我发现这个题目有多种不同的方法,这篇文章会对解决杨辉三角问题的几种不同方法进行总结。

分析:

这里先给出一张杨辉三角的图:

方法一:利用数学规律(前五行)

 我们对这张图进行分析,左边的字非常醒目,杨辉三角的前五行每一行的数值连起来分别是:

11的0次方:1

11的1次方:11

11的2次方:121

11的3次方:1331

11的4次方:14641

但是从第六行开始,这个规律便不再成立。

所以当我们只求杨辉三角前五行的数据时,我们直接可以采用暴力写法,使用pow函数和循直接可以解决,程序代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
    for(int i = 0;i <= 4;i++)
        printf("%lf\n",pow(11,i));
        return 0;
}

运行结果:

方法二:利用二维数组

同样我们对杨辉三角的图形进行分析,此时我们把杨辉三角想象成一个正直角三角形,这里给出一张图片:

我们把杨辉三角想象成一个正三角形,可以根据杨辉三角的构造总结出三条规律:

当列数为1的时候数值均为1;

当行数等于列数的时候数值也都为1; 

除了第一列和行数等于列数的数据,杨辉三角的任意一个数都等于它的前一行的数据加上它前一行前一列的数据。

根据这三条规律我们可以直接写出代码:

#include <iostream>
#include<stdio.h>
#include<assert.h>
const int size = 10;
void yanghui_trangle(int (*ar)[size], int row, int col) {//杨辉三角函数
	assert(ar != nullptr);
	for (int i = 1; i <= size; i++) {
		for (int j = 1; j <= i; j++) {
			if (i == j || j == 1) {//当列数为1或行数等于列数的时候赋值为1
				ar[i][j] = 1;
			}
			else {
				ar[i][j] = ar[i - 1][j] + ar[i - 1][j - 1];//杨辉三角中的任何一个数都等于他的前一行的数加上它前一行前一列的数
			}
		}
		printf("\n");
	}
}
void print_trangle(int(*ar)[size]){//打印函数
	assert(ar != nullptr);
	for (int i = 1; i <= size; i++) {
		for (int j = size; j >= i; j--) {
			printf("  ");
		}
		for (int j = 1; j <= i; j++) {
			printf("%4d", ar[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int ar[size][size];
	yanghui_trangle(ar, size, size);
	print_trangle(ar);
	return 0;
}

运行结果为: 

 

 方法三:利用一维数组

#include <stdio.h>
int main()
{
    int i, j, n, k, t; 
	long Buf[21]={0,1};    //用于保存一行数据
	printf("请输入杨辉三角形的行数(1 ~ 20):");
	scanf("%d",&n);
    for( i = 1; i <= n; i++)	//输出n行
    {
		for( j = 0; j < n - i; j++)	//每行前面补空格,形成等腰三角图案	
			printf("   ");
		t = 0;
        for( j = 1; j <= i; j++)//计算并输出杨辉三角形
        {
			k = Buf[j];
			Buf[j] = t + k;		//每个数是上面两数之和(三角计算)
			t = k;
            printf("%6d", Buf[j]);	
        }
        printf("\n");
    }
	return 0;
}

运行结果:

方法四:利用递归

同样我们利用上满的规律可以直接写出递归式:

int Yanghui_Trangle(int row, int col)//递归函数   
{
	return (col == 1 || col == row) ? 1 : Yanghui_Trangle( row - 1, col - 1 ) + Yanghui_Trangle( row - 1, col ); 
}	

完整程序:

#include <stdio.h>
int Yanghui_Trangle(int row, int col)//递归函数   
{
	return (col == 1 || col == row) ? 1 : Yanghui_Trangle( row - 1, col - 1 ) + Yanghui_Trangle( row - 1, col ); 
}	
int main() 
{
    int i, j, size;
	scanf("%d", &size);
    for( i = 1; i <= size; i++)
    {
		for( j = 0; j < size - i; j++)
			printf("   ");
        for( j = 1; j <= i; j++)
            printf("%6d", Yanghui_Trangle(i, j));
        printf("\n");
    }
	return 0;
}

如图我输入杨辉三角的行数为10,运行结果为:

参考资料:

【C语言】输出杨辉三角形 - 杨辉等腰三角形(杨辉三角最佳算法) 输出杨辉三角前十行_WW......的博客-CSDN博客_杨辉三角c语言

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ritchie_Zeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值