队列实现杨辉三角

合集下载

杨辉三角解题公式(二)

杨辉三角解题公式(二)

杨辉三角解题公式(二)杨辉三角解题公式什么是杨辉三角?杨辉三角是中国古代数学家杨辉发现的一种特殊数列排列方式。

它的特点是,每一行的端点和每一行的中间数都是1,其他位置上的数是上一行两个相邻数的和。

杨辉三角解题公式第n行第k个数的计算公式第n行第k个数的计算公式可以表示为:C(n,k)=n!k!(n−k)!其中,n!表示n的阶乘,即n!=n×(n−1)×(n−2)×...×2×1。

例子我们来计算一下杨辉三角的第5行:第1个数:C(5,1)=5!1!(5−1)!=5!1!×4!=5×4×3×2×11×4×3×2×1=5第2个数:C(5,2)=5!2!(5−2)!=5!2!×3!=5×4×3×2×12×1×3×2×1=10第3个数:C(5,3)=5!3!(5−3)!=5!3!×2!=5×4×3×2×13×2×1×2×1=10第4个数:C(5,4)=5!4!(5−4)!=5!4!×1!=5×4×3×2×14×3×2×1×1=5第5个数:C(5,5)=5!5!(5−5)!=5!5!×0!=5×4×3×2×15×4×3×2×1×1=1所以,第5行的数列为:1, 5, 10, 10, 5, 1。

这就是杨辉三角的特性:每一行的数都可以通过计算上一行的两个相邻数得到,并且每一行的端点和中间数都是1。

队列——杨辉三角——王文合

队列——杨辉三角——王文合
七:实验总结:本实验利用队列的基本操作实现杨辉三角形的输出,但是只用到队列的创建和队 列的属性如“先进先出”,但是是感觉和数组差不多。还是体会不到队列的优点。源自实验报告:实验五 队列应用
一、 实验目的
掌握队列的基本操作:初始化队列、判队列为空、出队列、入队列等运算。
二、实验要求
1. 认真阅读和掌握本实验的算法。 2. 上机将本算法实现。 3. 保存和打印出程序的运行结果,并结合程序进行分析。
三、实验题目 杨辉三角形问题
问题描述:利用队列的基本操作实现杨辉三角形的输出
四:实验人:保定学院 13 级软件工程 1 班-王文合 五:代码实现:
学号:130624074 时间:2014.10.19
程序代码
#include"stdio.h" #include"conio.h" #define M 100
typedef struct {
int data[M]; int f,r;
}SE; SE IN()//创建队列
{ SE Q; Q.f=Q.r=1;
return Q; } void sanjiao(int h,SE Q)//杨辉三角核心算法
{ int c,n,d,k,l; SE q=Q;
for(c=1;c<=h;c++) { for(l=0;l<h-c;l++)
{ printf(" ");
q.data[q.r]=n;
} printf("%d ",q.data[q.f]);
} printf("\n\n"); }
} main(){//主方法 int a; SE Q=IN(); printf("请输入杨辉三角的行数 A!\n"); scanf("%d",&a); sanjiao(a,Q); getch(); } 六:测试

python实现杨辉三角的几种方法代码实例

python实现杨辉三角的几种方法代码实例

python实现杨辉三⾓的⼏种⽅法代码实例⽅法⼀:迭代def triangle_1(x):""":param x: 需要⽣成的杨辉三⾓⾏数:return:"""triangle = [[1], [1, 1]] # 初始化杨辉三⾓n = 3 # 从第三⾏开始计数,逐⾏添加while n <= x:for i in range(0, n-1):if i == 0:# 添加初始列表[1,1],杨辉三⾓每⾏的⾸位和末位必为1triangle.append([1, 1])else:# 逐位计算,并插⼊初始列表中triangle[n-1].insert(i, triangle[n - 2][i] + triangle[n - 2][i - 1])n += 1return trianglex = 11triangle = triangle_1(x)# 遍历结果,逐⾏打印for i in range(x):print(' '.join(str(triangle[i])).center(100)) # 转为str,居中显⽰⽅法⼆:⽣成器def triangle_2(n):""":param n: 需要⽣成的杨辉三⾓⾏数:return:"""triangle = [1] # 初始化杨辉三⾓for i in range(n):yield triangletriangle.append(0) # 在最后⼀位加个0,⽤于计算下⼀⾏triangle = [triangle[i] + triangle[i - 1] for i in range(len(triangle))]# 从⽣成器取值for i in triangle_5(10):print(''.join(str(i)).center(100)) # 格式化输出⽅法三:递归杨辉三⾓特性:【1,1】=【0,1】+【1,0】【1,2,1】=【0,1,1】+【1,1,0】【1,3,3,1】=【0,1,2,1】+【1,2,1,0】【1,4,6,4,1】=【0,1,3,3,1】+【1,3,3,1,0】第n⾏等于第n-1⾏分别⾸尾补0,然后按位相加def triangle_4(n):""":param n:需要⽣成的杨辉三⾓⾏数:return:"""triangle = [1] # 初始化杨辉三⾓if n == 0:return trianglereturn [x+y for x, y in zip([0] + triangle_4(n - 1), triangle_4(n - 1) + [0])]for i in range(10):print(''.join(str(triangle_4(i))).center(100))到此这篇关于python实现杨辉三⾓的⼏种⽅法代码实例的⽂章就介绍到这了,更多相关python实现杨辉三⾓内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

杨辉三角实验报告

杨辉三角实验报告

杨辉三角(一)需求分析1.逐行打印二项展开式(a + b)i 的系数2.要求:输入杨辉三角的阶数n,在屏幕上显示数杨辉三角形。

3.输入的值n以小于12为宜(图形漂亮)。

(二)概要设计1. 首先初始化一个队列,元素为1,然后根据这个队列迭代生成任意行的二项式系数。

2. 判断用户输入的行数,然后决定循环次数。

这些循环中,程序根据杨辉三角的实际构造函数模拟构造过程。

每次形成一个新的二项式系数序列,并将这个序列保持在一个新的队列中。

本次循环结束后,这个心构造的序列将作为下次循环来构造另一个二项式序列的参照序列。

(三)详细设计1.定义队列结点typedef struct QNode{int data;struct QNode *next;}QNode ,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;2.基本操作函数原型●队列初始化void InitQueue(LinkQueue *Q){Q->front =Q->rear = (QueuePtr)malloc(sizeof(QNode));if(!Q->front) printf("OVERFLOW");Q->front->next= NULL;}●插入元素e为新的队尾元素void EnQueue(LinkQueue *Q,int e){QNode *p;p = (QueuePtr)malloc(sizeof(QNode));if(!p) printf("OVERFLOW");p->data = e;p->next = NULL;Q->rear->next = p;Q->rear = p;}●void DeQueue(LinkQueue *Q){ QNode *p;if(Q->front == Q->rear) printf("ERROR");Q->front->next = Q->front->next->next;}●美化形状for(i = 1;i <= n; i++){printf("\n");c=i;for(b=1;b<=n-c;c++){printf(" ");}}●根据上行系数求下行系数for (j=1;j<=i+2;j++){t = q->front->next->data;DeQueue (q);EnQueue (q,s+t);s = t;if (j!=i+2) printf("%3d ",s);}(四)调试分析1.美化形状时,第一次的输出空格的个数和位置考虑的有瑕疵,导致图像歪歪曲曲的。

利用队列实现逐行打印杨辉三角形的前n行

利用队列实现逐行打印杨辉三角形的前n行

利⽤队列实现逐⾏打印杨辉三⾓形的前n⾏
分别打印⼆项式(a+b)^n展开项的系数,在程序中利⽤了⼀个队列,在输出上⼀⾏系数时,将下⼀⾏的系数预先放⼊队列中。

在各⾏系数间插⼊0。

void YANGVI(int n){
Queue q(n+2); //建⽴队列对象q并初始化。

int i=1,j,s=0,t,u;
q.EnQueue(1);q.EnQueue(1); //插⼊第⼀⾏元素
for(i=1; i<=n; i++){
cout<<endl; //换⾏
q.EnQueue(0); //每⾏刚开始打印的时候,先在队列尾部插⼊⼀个0
for(j=1; j<=i+2; j++){ //第i⾏有i+1个系数和1个0
q.DeQueue(t); //第i⾏第j个系数t出队列
u=s+t; //s为第i⾏第j-1个系数,j==1时s必为0
q.EnQueue(u); //计算第i+1⾏第j个系数u=s+t并进队列
s=t;
if(j!=i+2) cout<<s<<''; //打印移除的系数,第i+2个是0
}
}
}
最后第n⾏的n+2次循环执⾏完后,队列⾥是第n+1⾏的n+2个数,0还没来得及⼊队列(因为换⾏后才会把0⼊队列)。

用队列方法输出杨辉三角

用队列方法输出杨辉三角

/*用队列方法输出杨辉三角。

*/#include<iostream.h>#include<iomanip.h>#include<stdlib.h>#define ElemType int/*-----LNode的结点类型定义-----*/struct LNode{ElemType data; //值域LNode* next; //链接指针域};/*-----队列的链接存储结构的定义-----*/struct LinkQueue{LNode* front; //队首指针LNode* rear; //队尾指针};/*------1.初始化链队-----*/void InitQueue(LinkQueue& HQ){HQ.front=HQ.rear=NULL; //把队首和队尾指针置为空}/*-----2.向链队中插入一个元素------*/void EnQueue(LinkQueue& HQ, ElemType item){LNode* newptr=new LNode; //得到一个新的结点newptr->data=item; //把item 的值赋给新结点的值域newptr->next=NULL; //把新结点的指针域置为空if(HQ.rear==NULL) //若链队为空,则新结点既是队首又是队尾{HQ.front=HQ.rear=newptr;}else //若链队非空,则新结点被链接到队尾并修改队尾指针{HQ.rear=HQ.rear->next=newptr;}}/*-------3.从队列中删除一个元素-------*/ElemType OutQueue(LinkQueue& HQ){if(HQ.front==NULL) //若链队为空则终止运行{cerr<<"链队为空,无法删除!"<<endl;exit(1);}ElemType temp=HQ.front->data; //暂存队首元素以便返回LNode* p=HQ.front; //暂存队首指针以便收回队首指针HQ.front=p->next; //使队首指针指向下一个结点if(HQ.front==NULL) //若删除后链队为空,则使队尾指针为空{HQ.rear=NULL;}delete p; //回收原队首结点return temp; //返回被删除的队首元素}void YanyHuiTriangular(LinkQueue& HQ, int n){int i,j; //i,j 都是循环变量int first,second; //first,second 分别记录上一行的两个累加数EnQueue(HQ,1);for(i=1; i<n+1; i++){ //第 0 至 n-1 行元素分别入列,并输出;最后第 n 行入列first=0; second=0;//控制每行前头空格的输出for(j=0; j<n-i+1; j++){cout<<setw(3)<<' ';}for(j=0; j<i; j++){second=OutQueue(HQ);cout<<setw(3)<<second<<setw(3)<<' ';EnQueue(HQ,first+second);first=second;}cout<<endl; //输完一行,回车EnQueue(HQ,second);}//最后输出最后一行元素(即第 n 行出列)for(j=0; j<n+1; j++){cout<<setw(3)<<OutQueue(HQ)<<setw(3)<<' '; }cout<<endl;}void main(){LinkQueue LQ;InitQueue(LQ);cout<<"用队列输出杨辉三角!"<<endl<<endl; int n;cout<<"请输入要输出多少行杨辉三角:"; cin>>n;YanyHuiTriangular(LQ,n);}。

数据结构实验报告(杨辉三角-约瑟夫环)

数据结构实验报告(杨辉三角-约瑟夫环)

数据结构实验报告实验一杨辉三角形(Pascal’s triangle)一、需求分析1.输入的形式和输入值的范围本程序中,需输入的杨辉三角级数level为正整数,由键盘输入,以回车结束2.输出的形式通过屏幕输出杨辉三角3.程序所能达到的功能用户从键盘输入需要的杨辉三角级数,从屏幕输出杨辉三角4.测试数据输入:5输出: 1 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1二、概要设计以链队列结构实现该实验1.抽象数据类型定义ADT Queue {数据对象:D = { ai | ai∈ElemSet , i = 1,2,…,n,n≥0 }数据关系:R1={<ai-1,ai> | ai-1 , ai∈D, i=2,…,n}约定其中ai端为队列头,an端为队列尾基本操作:InitQueue ( &Q )操作结果:构造一个空队列QDestroyQueue ( &Q )初始条件:队列Q已存在操作结果:队列Q被销毁,不再存在ClearQueue ( &Q )初始条件:队列Q已存在操作结果:将Q清为空队列QueueEmpty ( Q )初始条件:队列Q已存在操作结果:若Q为空队列,则返回TRUE,否则FALSEQueueLength ( Q )初始条件:队列Q已存在操作结果:返回Q的元素个数,即队列长度GetHead ( Q , &e )初始条件:Q为非空队列操作结果:用e返回Q的队头元素EnQueue ( &Q , e )初始条件:队列Q已存在操作结果:插入元素e为Q的新队尾元素DeQueue ( &Q , &e )初始条件:Q为非空队列操作结果:删除Q的队头元素,并用e返回其值QueueTraverse ( Q , visit( ) )初始条件:Q已存在且非空操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit( )。

数据结构实验- 杨辉三角

数据结构实验- 杨辉三角

实验4 杨辉三角1 实验要求打印二项展开式(a+b)^i的系数,将其系数构成杨辉三角形。

2 简单的需求分析1,该程序的描述是:建立一个循环队列,以及一个利用队列实现逐行打印杨辉三角形的前n行的算法,最后在主函数中输入所要打印的杨辉三角形的行数,调用函数输出结果。

2,程序运行后,首先会出现"请输入二项式为几次幂",用户根据自己的选择输入后,系统便会输出打印的情况。

3 概要设计1、所用的抽象数据类型:(1)//循环队列的类定义template<class T>class SeqQueue{public:SeqQueue(int sz=10); //构造函数~SeqQueue(){delete[] elements;} //析构函数bool EnQueue(const T& x); //若队列不满,则将x进队,否则队溢出处理bool DeQueue(T& x); //若队列不空,则退出队头元素x并由函数返回true,否则队空,返回falseprotected:int rear,front; //队尾与队头指针T* elements; //存放队列元素的数组int maxSize; //队列最大可容纳元素个数};(2) //链式栈的类定义void YANGVI(int n){//分行打印二项式(a+b)^n展开式的系数,在程序中利用一个队列,在输出上一行系数时,将其//下一行的系数预先放入队列中,在各行系数之间插入一个0int k;SeqQueue<int> q(n+2); //建立队列对象并初始化int i=1,j,s=k=0,t,u,m; //计算下一行系数时用到的工作单元q.EnQueue(i);q.EnQueue(i); //预先放入第一行的两个系数for(i=1;i<=n;i++) //逐行处理{cout<<endl; //换一行q.EnQueue(k); //各行间插入一个0for(j=1;j<=i+2;j++) //处理第i行的i+2个系数(包括一个0){q.DeQueue(t); //读取一个系数u=s+t; q.EnQueue(u); //计算下一行系数,并进队列s=t;if(j!=i+2) cout<<s<<' '; //打印一个系数,第i+2个是0 }}}2、函数调用关系:在main()函数中,先输入所要打印的杨辉三角形的行数,然后调用YANGVI(int n)函数4 详细设计部分#include<iostream.h>#include<assert.h>#include<stdio.h>//循环队列的类定义template<class T>class SeqQueue{public:SeqQueue(int sz=10); //构造函数~SeqQueue(){delete[] elements;} //析构函数bool EnQueue(const T& x); //若队列不满,则将x进队,否则队溢出处理bool DeQueue(T& x); //若队列不空,则退出队头元素x并由函数返回true,否则队空,返回falseprotected:int rear,front; //队尾与队头指针T* elements; //存放队列元素的数组int maxSize; //队列最大可容纳元素个数};//循环队列的构造函数template<class T>SeqQueue<T>::SeqQueue(int sz):front(0),rear(0),maxSize(sz){//建立一个最大具有maxSize个元素的空队列elements=new T[maxSize];//创建队列空间assert(elements!=NULL);//断言:动态存储分配成功与否}//循环队列的进队template<class T>bool SeqQueue<T>::EnQueue(const T& x){if((rear+1)%maxSize==front) {return false;} //队列满则插入失败,返回else{elements[rear]=x; //按照队尾指针指示位置插入rear=(rear+1)%maxSize; //队尾指针加1return true; //插入成功,返回}}//循环队列的出队template<class T>bool SeqQueue<T>::DeQueue(T& x){if(front==rear) {return false;} //若队列空则删除失败,返回else{x=elements[front];front=(front+1)%maxSize; //队头指针加1return true;//删除成功,返回}}//打印杨辉三角形的前n行函数定义void Y ANGVI(int n){//分行打印二项式(a+b)^n展开式的系数,在程序中利用一个队列,在输出上一行系数时,将其//下一行的系数预先放入队列中,在各行系数之间插入一个0int k;SeqQueue<int> q(n+2); //建立队列对象并初始化int i=1,j,s=k=0,t,u,m; //计算下一行系数时用到的工作单元q.EnQueue(i);q.EnQueue(i); //预先放入第一行的两个系数for(i=1;i<=n;i++) //逐行处理{cout<<endl; //换一行q.EnQueue(k); //各行间插入一个0for(j=1;j<=i+2;j++) //处理第i行的i+2个系数(包括一个0){q.DeQueue(t); //读取一个系数u=s+t; q.EnQueue(u); //计算下一行系数,并进队列s=t;if(j!=i+2) cout<<s<<' '; //打印一个系数,第i+2个是0}}}//主函数void main(){int m;cout<<"请输入二项式为几次幂"<<endl;cin>>m;Y ANGVI(m);cout<<endl;}/5 调试与测试1.输入所要打印的杨辉三角形的行数2,显示结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Main:
queue.h:
typedef int ElemType;
typedef struct Inode{
ElemType data;
struct Inode *next;
}Inode;
typedef struct linkque{
Inode *front;
Inode *rear;
}linkque;
}
while(q2.front!=q2.rear){
QueOut(q2,e);
QueIn(q1,e);
}
}
}
queue.cpp:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "queue.h"
int QueInit(linkque &q){
Inode *p;
p=(Inode *)malloc (sizeof(Inode));
if(!p)
return (0);
p->data=e;
p->next=NULL;
q.rear->next=p;
q.rear=p;
return (1);
}
int QueOut(linkque &q,ElemType &e){
Inode *p;
if(q.front==q.rear)
return (0);
p=q.front->next;
e=p->data;
q.front->next=p->next;
if(q.rear==p)
q.rear=q.front;
free(p);
return(1);
}
#include "queue.h"
vБайду номын сангаасid main(){
linkque q1,q2;
int i,n;
ElemType e,e1,e2,e3;
printf("请输入需要的杨辉三角长度:\n");
scanf("%d",&n);
QueInit(q1);
QueInit(q2);
for(i=1;i<=n;i++){
e3=0;
while(q1.front!=q1.rear){
QueOut(q1,e1);
e2=e3+e1;
printf("%d\t",e2);
QueIn(q2,e2);
e3=e1;
}
if(q1.front==q1.rear){
e2=1;
QueIn(q2,e2);
printf("%d",e2);
printf("\n");
int QueInit(linkque &);
int QueIn(linkque &,ElemType);
int QueOut(linkque &,ElemType &);
app.cpp:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
q.front=(Inode *)malloc (sizeof(Inode));
q.rear=q.front;
if(!q.front){
printf("溢出");
return (0);
}
q.front->next=NULL;
return (1);
}
int QueIn(linkque &q,ElemType e){
相关文档
最新文档