杨辉三角的两种实现

杨辉三角的两种实现

问题描述

杨辉三角,又称帕斯卡三角是一个由数字排列成的三角形数表,如图所示:
这是一个15阶杨辉三角

问题分析

杨辉三角具有以下性质:

  1. 第一行只有一个数,第i行有i个数。
  2. 第i行最左端和最右端的数均为1。
  3. 每一个数等于上一行的左右两个数之和,即第n行的第i个数等于第n-1行的第i-1个数和第i个数之和。
问题实现

本文尝试用两张方法进行实现:用数组来进行存储,和利用队列的性质来实现。

  1. 运用数组:
  • 运用性质:每一个元素值等于上一行它对应的数和前一个数的和。如上图中第五行第二个值4等于第四行第一个值1加上第四行第二个值3。
  1. 运用队列:
  • 运用队列先进先出的性质对(然而效果不好还很麻烦,建议还是就直接用性质做吧~)
代码实现
#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值