杨辉三角的循环输出 C++实现


前言

杨辉三角是二项式系数在三角形中的—种几何排列,其中蕴含着二项式系数的几个相关性质,包括二项式系数的对称性、增减性与最大值、各二项式系数的和等。

杨辉三角的输出可以锻炼我们对循环的熟练使用,本文将杨辉三角问题分解转化为一个个小问题,最终组合实现完整输出,手把手教学,不要错过!

一、思路分析

我们首先分析杨辉三角的结构特点,考虑数据的存储形式。

在这里插入图片描述
通过观察,我们可以看到,根据输出行数的不同,输出的数据量也不同,因此我们暂不考虑用数组来存储数据。
通过进一步的数字分析,我们可以找到每一行数据的数学规律,它们都是该行行数的组合数。

我们可以得出杨辉三角的一些数学性质:

在这里插入图片描述
由此可得,我们只需对每一行循环,在每一行中,对该行行数的组合数进行循环输出即可。

二、函数准备

我们首先来分析需要准备的功能函数,考虑到在编写过程中,我们需要计算组合数,需要计算阶乘,我们首先实现这两种数学运算。

1.阶乘计算

利用基本数学知识,我们俩可以快速实现阶乘计算。

代码如下(示例):

int factorial(int n)
{
	// ans 记录计算结果
	int ans = 1;

	// i 从 n 到 0 ,逐项相乘,ans 即为最终结果
	for (int i = n; i > 0; i--)
	{
		ans = ans * i;
	}

	return ans;
}

2.组合数计算

利用现有的阶乘计算函数,我们根据公式即可求出制定数的组合数。

代码如下(示例):

int combination(int n, int m)
{
	// 根据组合数的公式,用 ans 记录计算结果
	int ans = 0;

	// 第一步,ans = n!
	ans = factorial(n);

	// 第二步,ans = (n!)/(n-m)!
	ans = ans / factorial(n - m);

	// 第三步,ans = (n!)/((n-m)! * m!)
	ans = ans / factorial(m);

	return ans;
}

三、代码实现

1.直角形式

在已经编写好的两个函数的基础上,我们来分析杨辉三角的的输出。

我们将每一行分为两个部分,第一部分是从小到大的递增部分,可以用一个循环实现,第二部分是从大到小的递减部分,我们也可以用一个循环实现,在此基础上,循环每一行,即可得到杨辉三角。

代码如下(示例):

void yang_hui_tiangle_right_angle(int floor)
{
	for (int i = 0; i < floor; i++) // i 为需要输出的行数,从 0 开始,每一行从小到大再到小
	{
		for (int j = 0; j < (i + 1) / 2; j++) // 首先输出从小到大前半行
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		for (int j = i / 2; j >= 0; j--) // 首先输出从大到小后半行
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		cout << endl;


	}

	return;
}

编译函数,我们看一下输出结果:

在这里插入图片描述
输出结果基本符合预期,我们进一步思考,优化他的输出形式,看起来更美观一些。

2.等腰形式

为了使输出结果看起来是等腰三角形的样子,我们在输出每一行数据前,需要输出一定量的空格,空格的数量可以根据总行数与本行的差值来确定。

代码如下(示例):

void yang_hui_tiangle_isosceles(int floor)
{
	for (int i = 0; i < floor; i++)
	{
		for (int j = 0; j < floor - i - 1; j++)
		{
			cout << "  ";
		}
		for (int j = 0; j < (i + 1) / 2; j++)
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		for (int j = i / 2; j >= 0; j--)
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		cout << endl;


	}

	return;
}

3.完整源码

将所有函数统一编译,看一下输出结果。

代码如下(示例):

/* Alkaid#3529 */

#include<iostream>
using namespace std;

// 计算 n 的阶乘
int factorial(int n);

// 计算组合数
int combination(int n, int m);

// 根据指定层数 n ,以直角形式,输出杨辉三角
void yang_hui_tiangle_right_angle(int floor);

// 根据指定层数 n ,以等腰形式,输出杨辉三角
void yang_hui_tiangle_isosceles(int floor);

int main()
{
	int floor = 0;


	// 读取需要输出的层数 floor
	cout << "请输入需要打印的层数:\n";
	cout << "floor = ";
	cin >> floor;

	// 以直角三角形的形式输出杨辉三角
	cout << "\n杨辉三角直角形式:\n";
	yang_hui_tiangle_right_angle(floor);

	// 以等腰三角形的形式输出杨辉三角
	cout << "\n杨辉三角等腰形式:\n";
	yang_hui_tiangle_isosceles(floor);

	return 0;

}

int factorial(int n)
{
	// ans 记录计算结果
	int ans = 1;

	// i 从 n 到 0 ,逐项相乘,ans 即为最终结果
	for (int i = n; i > 0; i--)
	{
		ans = ans * i;
	}

	return ans;
}

int combination(int n, int m)
{
	// 根据组合数的公式,用 ans 记录计算结果
	int ans = 0;

	// 第一步,ans = n!
	ans = factorial(n);

	// 第二步,ans = (n!)/(n-m)!
	ans = ans / factorial(n - m);

	// 第三步,ans = (n!)/((n-m)! * m!)
	ans = ans / factorial(m);

	return ans;
}

void yang_hui_tiangle_right_angle(int floor)
{
	for (int i = 0; i < floor; i++) // i 为需要输出的行数,从 0 开始,每一行从小到大再到小
	{
		for (int j = 0; j < (i + 1) / 2; j++) // 首先输出从小到大前半行
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		for (int j = i / 2; j >= 0; j--) // 首先输出从大到小后半行
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		cout << endl;


	}

	return;
}

void yang_hui_tiangle_isosceles(int floor)
{
	for (int i = 0; i < floor; i++)
	{
		for (int j = 0; j < floor - i - 1; j++)
		{
			cout << "  ";
		}
		for (int j = 0; j < (i + 1) / 2; j++)
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		for (int j = i / 2; j >= 0; j--)
		{
			if (combination(i, j) < 10)
				cout << "  " << combination(i, j) << " ";
			else if (combination(i, j) < 100)
				cout << " " << combination(i, j) << " ";
			else
				cout << combination(i, j) << " ";
		}
		cout << endl;


	}

	return;
}

输出结果如下:

在这里插入图片描述
结果符合预期,可以放心复制使用,如果满意的话,记得点个赞哦!


总结

杨辉三角是常见的基础问题,仔细分析,并不复杂,但对于初学者来说可以很好的锻炼基础知识。不积跬步,无以至千里;不积小流,无以成江海,想学习C++的同学可以关注我的频道,有许多经典题型的详细解答。

后续会稳定更新C++的进阶教程,以及数据结构与算法等更多内容,感情兴趣的话不妨点点关注哦!

最后,我是Alkaid#3529,期待你的关注。

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alkaid3529

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

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

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

打赏作者

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

抵扣说明:

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

余额充值