前言
杨辉三角是二项式系数在三角形中的—种几何排列,其中蕴含着二项式系数的几个相关性质,包括二项式系数的对称性、增减性与最大值、各二项式系数的和等。
杨辉三角的输出可以锻炼我们对循环的熟练使用,本文将杨辉三角问题分解转化为一个个小问题,最终组合实现完整输出,手把手教学,不要错过!
一、思路分析
我们首先分析杨辉三角的结构特点,考虑数据的存储形式。
通过观察,我们可以看到,根据输出行数的不同,输出的数据量也不同,因此我们暂不考虑用数组来存储数据。 通过进一步的数字分析,我们可以找到每一行数据的数学规律,它们都是该行行数的组合数。
我们可以得出杨辉三角的一些数学性质:
由此可得,我们只需对每一行循环,在每一行中,对该行行数的组合数进行循环输出即可。
二、函数准备
我们首先来分析需要准备的功能函数,考虑到在编写过程中,我们需要计算组合数,需要计算阶乘,我们首先实现这两种数学运算。
1.阶乘计算
利用基本数学知识,我们俩可以快速实现阶乘计算。
代码如下(示例):
int factorial(int n)
{
int ans = 1;
for (int i = n; i > 0; i--)
{
ans = ans * i;
}
return ans;
}
2.组合数计算
利用现有的阶乘计算函数,我们根据公式即可求出制定数的组合数。
代码如下(示例):
int combination(int n, int m)
{
int ans = 0;
ans = factorial(n);
ans = ans / factorial(n - m);
ans = ans / factorial(m);
return ans;
}
三、代码实现
1.直角形式
在已经编写好的两个函数的基础上,我们来分析杨辉三角的的输出。
我们将每一行分为两个部分,第一部分是从小到大的递增部分,可以用一个循环实现,第二部分是从大到小的递减部分,我们也可以用一个循环实现,在此基础上,循环每一行,即可得到杨辉三角。
代码如下(示例):
void yang_hui_tiangle_right_angle(int floor)
{
for (int i = 0; i < floor; i++)
{
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.完整源码
将所有函数统一编译,看一下输出结果。
代码如下(示例):
#include<iostream>
using namespace std;
int factorial(int n);
int combination(int n, int m);
void yang_hui_tiangle_right_angle(int floor);
void yang_hui_tiangle_isosceles(int floor);
int main()
{
int floor = 0;
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)
{
int ans = 1;
for (int i = n; i > 0; i--)
{
ans = ans * i;
}
return ans;
}
int combination(int n, int m)
{
int ans = 0;
ans = factorial(n);
ans = ans / factorial(n - m);
ans = ans / factorial(m);
return ans;
}
void yang_hui_tiangle_right_angle(int floor)
{
for (int i = 0; i < floor; i++)
{
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,期待你的关注。
|