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语言

猜你喜欢

转载自blog.csdn.net/weixin_45571585/article/details/126718478