杨辉三角居中比较复杂,行数越多位数越多,以此我们考虑从下面开始,记录一列最大的位数使上面的数字居中
先看最终效果
我们使用一个“棋盘”储存,将空格也放入其中
(演示就不打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;
}
}