问题描述:
设计一个程序,输入一个数n,然后输出n行杨辉三角形。
简介:
杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
杨辉三角的特点:
1.每个数等于它上方两数之和。
2.每行数字左右对称,由1开始逐渐变大。
3.第n行的数字有n项。
杨辉三角形如下:
这里我们用c++的结构体结合循环队列来进行编译:
定义结构体:
typedef int QElemType;
typedef struct SqQueue //定义结构体SqQueue
{
QElemType *base;
int front; //前一个
int rear; //后一个
}SqQueue;
c++代码实现:
#include <iostream>
#include <stdlib.h>
using namespace std;
# define MAXQSIZE 100
# define TRUE 1
# define FALSE 0
# define ERROR 0
循环队列的各功能:
int EnQueue(SqQueue &Q,QElemType e) //往循环队列添加数据
{
if((Q.rear+1)%MAXQSIZE==Q.front)
{
cout<<"错误!!!队列中已满 ! ";
return ERROR;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1) % MAXQSIZE;
return OK;
}
int DeQueue(SqQueue &Q,QElemType &e) //往循环队列删除数据
{
if(Q.front==Q.rear)
{
cout<<endl<<"错误!!! 队列为空!";
return (ERROR);
}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return e;
}
int InitQueue(SqQueue &Q) //创建循环列表
{
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)//判断是否创建成功
{
cout<<endl<<"错误!!! 创建失败! ";
return ERROR;
}
Q.front=Q.rear=0;
return TRUE;
}
int DestroyQueue(SqQueue &Q)//销毁队列
{
if(Q.base)
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0; //空队列的标志是队头队尾指针都相同,且为0
return TRUE;
}
int IsEmpty(SqQueue &Q)//判断循环队列是否为空
{
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
int GetHead(SqQueue Q, QElemType &p) //取循环队列队首元素
{
if(Q.front == Q.rear)
return FALSE;
else
{
p = Q.base[Q.front];
return TRUE;
}
}
主要算法实现:
void YangHuie(int sum)
{
int n,i;
QElemType temp;
QElemType p;
SqQueue Q;
InitQueue(Q);
EnQueue(Q, 1); //第一行元素入队
for(n = 2; n <= sum; n++) //产生第n行元素并入队,同时打印第n - 1 行的元素
{
EnQueue(Q, 1); //第n行的第一个元素入队
for(i = 1; i <= n-2; i++) //利用队中第n-1行元素产生第n行的中间n-2个元素并入对
{
DeQueue(Q,temp);
cout<<temp; //打印第n-1行的元素
GetHead(Q, p);
temp = temp + p; //利用队中第n-1行元素产生第n行元素
EnQueue(Q, temp);
}
DeQueue(Q, p);
cout<<p; //打印第n-1行元素的最后一个元素
cout<<"\n";
EnQueue(Q, 1); //第n行的最后一个元素入队
}
while(!IsEmpty(Q)) //打印最后一行元素
{
DeQueue(Q, p);
cout<<p;
}
cout<<"\n";
}
主函数main:
int main()
{
int n;
cout<<"请输入需要打印的行数:"<<"\n";
cin>>n;
cout<<"\n";
YangHui(n);
getchar();
}
代码运行结果: