杨辉三角的两种实现
问题描述
杨辉三角,又称帕斯卡三角是一个由数字排列成的三角形数表,如图所示:
问题分析
杨辉三角具有以下性质:
- 第一行只有一个数,第i行有i个数。
- 第i行最左端和最右端的数均为1。
- 每一个数等于上一行的左右两个数之和,即第n行的第i个数等于第n-1行的第i-1个数和第i个数之和。
问题实现
本文尝试用两张方法进行实现:用数组来进行存储,和利用队列的性质来实现。
- 运用数组:
- 运用性质:每一个元素值等于上一行它对应的数和前一个数的和。如上图中第五行第二个值4等于第四行第一个值1加上第四行第二个值3。
- 运用队列:
- 运用队列先进先出的性质对(然而效果不好还很麻烦,建议还是就直接用性质做吧~)
代码实现
#include<iostream>
using namespace std;
int main()
{
int n;
int a[100],b[100];
cout<< "please input the number of lines: "<<endl;
cin>>n; //输入想得到的杨辉三角行数
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++) //第一个元素和最后一个元素为1,其他为上一行两个值之和。
{
if(j==1||j==i)b[j]=1;
else {
b[j]=a[j-1]+a[j]; //数组a存储上一行的值,数组b存储该行的值。
}
}
for(int j=0;j<n-i+1;j++) //按照金字塔形状对每一行值进行打印。
{
cout<<" ";
}
for(int j=1;j<=i;j++)
cout<<b[j]<<" ";
cout<<endl;
for(int j=1;j<=i;j++) //将b数组中的值赋予给a数组。
a[j]=b[j];
}
return 0;
}
#include<iostream>
using namespace std;
#define MAXSIZE 100
struct Qnode{
int data;
Qnode* next;
};
struct LinkQueue{
Qnode* front;
Qnode* rear;
};
void InitQueue(LinkQueue *Q)
{
Qnode* a;
Q->front = a;
Q->rear = a;
if(Q->front==NULL)exit(-1);
Q->front->next=NULL;
}
int QueueEmpty(LinkQueue Q)
{
if(Q.rear->next==NULL) return 1;
else return 0;
}
int EnQueue(LinkQueue *Q,int e)
{
Qnode *s;
if(!s)exit(-1);
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
return 1;
}
int DeQueue(LinkQueue *Q,int *e){
Qnode* s;
if(Q->front==Q->rear) return 0;
else {
s=Q->front->next;
*e=s->data;
Q->front->next=s->next;
if(Q->rear==s)
Q->rear = Q->front;
delete s;
return 1;
}
}
int GetHead(LinkQueue* Q,int *e)
{
Qnode* s;
if(Q->front==Q->rear) return 0;
else {
s=Q->front->next;
*e=s->data;
return 1;
}
}
void PrintArray(int a[],int n,int N);
void YangHuiTriangle(int N);
int main()
{
int n;
cout<<"请输入要打印的行数: "<<endl;
cin>>n;
YangHuiTriangle(n);
return 0;
}
void YangHuiTriangle(int N)
{
int i,k,n;
int e,t;
int temp[MAXSIZE];
LinkQueue Q;
InitQueue(&Q);
k=0;
EnQueue(&Q,1);
for(n=2;n<=N;n++){
k=0;
EnQueue(&Q,1);
for(int i=1;i<=n-2;i++)
{
DeQueue(&Q,&t);
temp[k++]=t;
GetHead(&Q,&e);
t=t+e;
EnQueue(&Q,t);
}
DeQueue(&Q,&t);
temp[k++]=t;
PrintArray(temp,k,N);
EnQueue(&Q,1);
}
k=0;
while(!QueueEmpty(Q))
{
DeQueue(&Q,&t);
temp[k++]=t;
if(QueueEmpty(Q))
PrintArray(temp,k,N);
}
}
void PrintArray(int a[],int n,int N){
int i;
static int count=0;
for(int i=0;i<N-count;i++)
cout<<" ";
count++;
for(i=0;i<n;i++)
cout<<" "<<a[i];
cout<<endl;
}