//计算一个数所占用的宽度
int dataLen(int data)
{
int len = 0;
while (data > 0)
{
data /= 10;
len++;
}
return len;
}
//控制每个输出的数的宽度
void cortrolLen(int data, int max)
{
int len = 0;
len = dataLen(max) - dataLen(data);
while (len != 0)
{
cout <<" ";
len--;
}
}
//根据参数(行数)输出杨辉三角的数据
void yangHuiSanJiao(int linage)
{
int i, j, k; //循环计数器
int digit = 1, max = 1; //保存最大的数,用于控制输出的格式
//生成动态二维数组
typedef int* dynamicArray;
int ** p_YanHuiSanJiao = new dynamicArray[linage];
for (i=0; i<linage; i++)
{
p_YanHuiSanJiao[i] = new int[i+1];
}
//写入杨辉三角的数据
for (i=0; i<linage; i++)
for (j=0; j<=i; j++)
if (j==0 || j==i)
p_YanHuiSanJiao[i][j] = 1;
else p_YanHuiSanJiao[i][j] = p_YanHuiSanJiao[i-1][j-1] + p_YanHuiSanJiao[i-1][j];
//找出最大的数
for (i=linage-1,j=0; j<linage; j++)
if (p_YanHuiSanJiao[i][j] > max)
max = p_YanHuiSanJiao[i][j];
digit = dataLen(max);
//输出杨辉三角
for (i=0; i<linage; i++)
{
//控制数据前面的空格输出
for (j=0; j<(linage-i)*digit-(digit-1); j++)
cout <<" ";
for (j=0; j<=i; j++)
{
if (j != 0)
cortrolLen(p_YanHuiSanJiao[i][j], max);
cout <<p_YanHuiSanJiao[i][j];
//控制数据间的空格输出
for (k=0; k<digit; k++)
cout <<" ";
}
cout <<endl;
}
}
void main()
{
int n;
do
{
cout <<"请输入一个整数,以确定要输出杨辉三角的行数,输入0为退出:";
cin >>n;
if (n > 0)
yangHuiSanJiao(n);
}
while (n !=0);
}