IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 杨辉三角的循环输出 C++实现 -> 正文阅读

[数据结构与算法]杨辉三角的循环输出 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,期待你的关注。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:22:02  更:2022-01-03 16:22:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:30:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码