c++杨辉三角【左右对称方法及其实现】

杨辉三角居中比较复杂,行数越多位数越多,以此我们考虑从下面开始,记录一列最大的位数使上面的数字居中

先看最终效果

我们使用一个“棋盘”储存,将空格也放入其中

(演示就不打0了)

再定义一个二维数组,横向为x轴,竖向为y轴

用  i = x + (y - 1) * (2 * n1 - 1) - 1;将其一一对应

 定义一个长度为2n-1的数组,记录最后两行的位数

写一个函数将数字输出在想输出位数的中间,两边用空格

void shuchu(int n, int m, int lr )		//n为输出的长度,m为输出的数字,lr调整杨辉三角使其对称
{

	int k = weishu(m);
	for (int i = 0; i < (n - k + lr) / 2; i++)
	{
		cout << " ";
	}
	if (m != 0)
	cout << m;
	for (int i = 0; i < (n - k + 1 - lr) / 2; i++)
	{
		cout << " ";
	}	
}

这串代码可以达到如下输出效果,使位数少的数保持居中输出

用数组记录倒数两行的位数,最后遍历“棋盘”输出。

新人代码繁杂,多多见谅,注释还算详细

代码如下

#include <iostream>
using namespace std;

//一个返回输入值位数的函数
int weishu(int n)
{
	int i = 0;
	while (n)
	{
		n /= 10;
		i++;
	}
	return i;
}

//一个用于将数字输出在中间位置的函数
void shuchu(int n, int m, int lr )		//lr调整杨辉三角使其对称
{

	int k = weishu(m);
	for (int i = 0; i < (n - k + lr) / 2; i++)
	{
		cout << " ";
	}
	if (m != 0)
	cout << m;
	for (int i = 0; i < (n - k + 1 - lr) / 2; i++)
	{
		cout << " ";
	}	
}


int main()
{
	int n1;
	while (1)
	{
		int* yh;					//记录动态储存空间首位地址
		do
		{
			cout << "输入生成杨辉三角的行数(1<n<25)" << endl;
			cin >> n1;
		} while (n1 < 0 || n1>24);			//使用循环保证输入正确的数字
		//定义x和y便于以二维操控动态储存空间
		//x = 2 * n - 1;						
		//y = n;
		//i=x+(y-1)*(2*n-1)-1
		int x, y;
		yh = new int[(2 * n1 - 1) * n1];				//定义一个二维数组(作为“棋盘”)
		for (y = 1; y <= n1; y++)		//遍历行
		{
			for (x = 1; x <= 2 * n1 - 1; x++)		//遍历一行中的元素
			{
				int i = x + (y - 1) * (2 * n1 - 1) - 1;
				yh[i] = 0;
				if (x == n1 - y + 1 || x == n1 + y - 1)		//识别是否为1的位置
				{
					yh[i] = 1;
					//cout << yh[i]<<endl;
				}
			}
		}
		for (y = 3; y <= n1; y++)
		{
			for (x = n1 - y + 3; x < n1 + y - 1; x += 2)
			{
				int i = x + (y - 1) * (2 * n1 - 1) - 1;
				yh[i] = yh[i - 2 * n1] + yh[i - 2 * n1 + 2];
			}
		}

		int a[1000] = { 0 };
		for (x = 1; x <= 2 * n1 - 1; x++)
		{
			if (x % 2 == 1)y = n1;
			else y = n1 - 1;
			int i = x + (y - 1) * (2 * n1 - 1) - 1;
			a[x - 1] = weishu(yh[i]);					//以倒数两行确定“棋盘”每一列的输出位数
		}
		for (int i = 0; i < (2 * n1 - 1) * n1; i++)			//遍历输出棋盘每一个数
		{
			int lr;	//left and riget
			if (i % (2 * n1 - 1) < n1) lr = 0;
			else lr = 1;
			shuchu(a[i % (2 * n1 - 1)], yh[i], lr);
			if (i % (2 * n1 - 1) == 2 * n1 - 2) cout << endl;		//输出“棋盘”一行换行
		}
		delete[]yh;

	}
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值