C/C++经典杨辉三角问题解决方案

 更新时间:2023年02月01日 15:20:05   作者:36°熨斗的学习日记  
杨辉三角形,又称帕斯卡三角形、贾宪三角形、海亚姆三角形,它的排列形如三角形。本文将为大家介绍通过C++/C语言实现打印杨辉三角形的示例代码,需要的可以参考一下

按理来说,杨辉三角是一个非常经典的问题,以至于随手一搜遍地的代码,但是今天在使用c++实现时遇到了问题,百度出来的没有一个是我想要的答案,所以有了此文。

前言

本文主要讲述了杨辉三角c和c++的具体实现,均为动态。

一、杨辉三角是什么

杨辉三角是二项式系数的集合排列。

具体实现:

是第i行j列的数据是由上一列第j个和j-1个数据相加得到的。

二、C语言版实现步骤

1.开辟动态二维数组

首先开辟一个存储指针的地址的数组,即二级指针用来存放数据。

下一步便是给每一个二级指针的每个元素开辟空间。

代码如下(示例):

int** Creat(int m)
{
	// 杨辉三角每行数据与行数相同
    //先开二级指针
	int** triAngle = (int**)malloc(sizeof(int*) * m);
	assert(triAngle);
    // 再开二级指针中每个元素存储数据的数组
	for (size_t i = 0; i < m; i++)
	{
		triAngle[i] = (int*)malloc(sizeof(int) * (i + 1));
	}
	return triAngle;
}

2.初始化

杨辉三角的两个等腰边的数字是1,数学规律也比较好找,即每行第0个和最后一个是1,接下来就是开头提到的内部的规律:

是第i行j列的数据是由上一列第j个和j-1个数据相加得到的。

代码如下(示例):

void Init(int** triAngle, int m)
{
	// 先将两腰上的数据初始化为1
	for (size_t i = 0; i < m; i++)
	{
		if (i == 0)
		{
			triAngle[i][0] = 1;
		}
		else
		{
			triAngle[i][0] = triAngle[i][i - 1] = 1;
		}
	}
	// 构建杨辉三角
	for (size_t i = 0; i < m; i++)
	{
		for (size_t j = 0; j < i; j++)
		{
			if (triAngle[i][j] != 1)
			{
				triAngle[i][j] = triAngle[i - 1][j] + triAngle[i - 1][j - 1];
			}
		}
	}
}

3.打印

两层for循环遍历二维数组进行访问然后打印。

代码如下(示例):

void Print(int** triAngle, int m)
{
	for (size_t i = 0; i < m; i++)
	{
		for (size_t j = 0; j < i; j++)
		{
			printf("%d ", triAngle[i][j]);
		}
		printf("\n");
	}
}

4.销毁

首先释放一级指针,再释放存放它们的二级指针。

代码如下(示例):

void Destory(int** triAngle, int m)
{
	for (size_t i = 0; i < m; i++)
	{
		free(triAngle[i]);
	}
	free(triAngle);
}

二、C++版实现步骤

1.实现类的成员变量

杨辉三角只需要一个成员变量:二维数组(两个int的vector嵌套)

存放二维数组的行和列可以用_vv.size()和_vv[i].size()来表示。

代码如下(示例):

class Yanghui
{
private:
	vector<vector<int>> _vv;
	size_t _n;
};

2.实现成员函数

与c语言版相同,也需要创建、初始化、销毁。

创建&初始化

我将创建函数实现为了构造函数,目的是为了不用调用,创建的时候就是开辟好的且已经初始化好的vector<vector<int>>。

代码如下(示例):

// 构建实现为构造函数就不用调用了
	Yanghui(int n = 5)
	{
		_vv.resize(n);
		for (size_t i = 0; i < _vv.size(); i++)
		{
			_vv[i].resize(i + 1);
		}
		// 先初始化两腰数据为1
		for (size_t i = 0; i < _vv.size(); i++)
		{
			_vv[i][0] = _vv[i][_vv[i].size() - 1] = 1;
		}
		// 构建杨辉三角
		for (size_t i = 0; i < _vv.size(); i++)
		{
			for (size_t j = 0; j < _vv[i].size(); j++)
			{
				if (_vv[i][j] != 1)
				{
					_vv[i][j] = _vv[i - 1][j] + _vv[i - 1][j - 1];
				}
			}
		}
	}

打印

代码如下(示例):

void Print(int n)
	{
		for (size_t i = 0; i < n+1; i++)
		{
			for (size_t j = 0; j < i; j++)
			{
				cout << _vv[i][j] << " ";
			}
			cout << endl;
		}
	}

3.类的总体

代码如下(示例):

#include <vector>
using namespace std;
class Yanghui
{
public:
	// 构建实现为构造函数就不用调用了
	Yanghui(int n = 5)
	{
		_vv.resize(n);
		for (size_t i = 0; i < _vv.size(); i++)
		{
			_vv[i].resize(i + 1);
		}
		// 先初始化两腰数据为1
		for (size_t i = 0; i < _vv.size(); i++)
		{
			_vv[i][0] = _vv[i][_vv[i].size() - 1] = 1;
		}
		// 构建杨辉三角
		for (size_t i = 0; i < _vv.size(); i++)
		{
			for (size_t j = 0; j < _vv[i].size(); j++)
			{
				if (_vv[i][j] != 1)
				{
					_vv[i][j] = _vv[i - 1][j] + _vv[i - 1][j - 1];
				}
			}
		}
	}
	void Print()
	{
		for (size_t i = 0; i < _vv.size(); i++)
		{
			for (size_t j = 0; j < _vv[i].size(); j++)
			{
				cout << _vv[i][j] << " ";
			}
			cout << endl;
		}
	}
	~Yanghui()
	{
		cout << "~Yanghui()" << endl;
	}
private:
	vector<vector<int>> _vv;
};
int main()
{
	Yanghui triAngle(5);
	triAngle.Print();
	return 0;
}

到此这篇关于C/C++经典杨辉三角问题解决方案的文章就介绍到这了,更多相关C++杨辉三角内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ 虚函数与纯虚函数的区别(深入分析)

    c++ 虚函数与纯虚函数的区别(深入分析)

    本篇文章是对c++中虚函数与纯虚函数的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 使用C++开发一个串口读写软件的实现步骤

    使用C++开发一个串口读写软件的实现步骤

    这篇文章主要介绍了使用xmake(一个项目管理工具兼包管理工具)和asio2(一个asio的框架,可以实现轻松各种网络应用,一般支持tcp,udp,http,websocket,rpc,ssl,icmp,serial_port.)来快速的开发个串口读写软件(整合例程),需要的朋友可以参考下
    2025-04-04
  • 如何基于 Blueprint 在游戏中创建实时音视频功能

    如何基于 Blueprint 在游戏中创建实时音视频功能

    我们在本文先来讲讲如何在 Unreal 中用 Blueprint 快速实现。稍后会分享基于 C++的实现步骤。感兴趣的朋友跟随小编一起看看吧
    2020-05-05
  • C语言实现弹跳小球动画

    C语言实现弹跳小球动画

    这篇文章主要为大家详细介绍了C语言实现弹跳小球动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言练习题:求1到10的阶乘之和简单实例

    C语言练习题:求1到10的阶乘之和简单实例

    下面小编就为大家带来一篇C语言练习题:求1到10的阶乘之和简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • C++扫盲篇之指针详解

    C++扫盲篇之指针详解

    C++中一个指针的使用就已经让很多人欲哭无泪,可是更不幸的是他还有指向指针的指针,这篇文章主要给大家介绍了关于C++扫盲篇之指针的相关资料,需要的朋友可以参考下
    2022-03-03
  • 简述C++的复杂性

    简述C++的复杂性

    这篇文章主要介绍了简述C++的复杂性,帮助大家更好的理解和认识c++编程语言,感兴趣的朋友可以了解下
    2020-08-08
  • C语言深入探究函数的溯源

    C语言深入探究函数的溯源

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数
    2022-04-04
  • C/C++使用过程中的溢出问题详解

    C/C++使用过程中的溢出问题详解

    在C/C++程序里有一类非常典型的问题,那就是:溢出问题,现在分别来分析一下常见的数组溢出,整数溢出,缓冲区溢出,栈溢出和指针溢出等,需要的朋友可以参考下
    2024-01-01
  • C语言简明讲解操作符++和--的使用方法

    C语言简明讲解操作符++和--的使用方法

    ++和--运算符分别是+=1和-=1的简写。设计这样两个运算符的本意是⽅便程序员,但i++和++i使⽤不恰当有时候会造成混淆,反倒令刚入门的C程序员有点混乱
    2022-04-04

最新评论