杨辉三角算法集锦.docx

上传人:b****2 文档编号:603931 上传时间:2023-04-29 格式:DOCX 页数:12 大小:15.66KB
下载 相关 举报
杨辉三角算法集锦.docx_第1页
第1页 / 共12页
杨辉三角算法集锦.docx_第2页
第2页 / 共12页
杨辉三角算法集锦.docx_第3页
第3页 / 共12页
杨辉三角算法集锦.docx_第4页
第4页 / 共12页
杨辉三角算法集锦.docx_第5页
第5页 / 共12页
杨辉三角算法集锦.docx_第6页
第6页 / 共12页
杨辉三角算法集锦.docx_第7页
第7页 / 共12页
杨辉三角算法集锦.docx_第8页
第8页 / 共12页
杨辉三角算法集锦.docx_第9页
第9页 / 共12页
杨辉三角算法集锦.docx_第10页
第10页 / 共12页
杨辉三角算法集锦.docx_第11页
第11页 / 共12页
杨辉三角算法集锦.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

杨辉三角算法集锦.docx

《杨辉三角算法集锦.docx》由会员分享,可在线阅读,更多相关《杨辉三角算法集锦.docx(12页珍藏版)》请在冰点文库上搜索。

杨辉三角算法集锦.docx

杨辉三角算法集锦

杨辉三角算法集锦

/*

Name:

杨辉三角算法集锦

分别使用了二维数组,一维数组,队列,二项式公式,组合公式推论和递归方法等9种算法

*/

#include

#include

usingnamespacestd;

constintMAXROW=40;

voidPrintBlank(intn);

intCom(intn,intm);

intTry(introw,intcel);

voidFun_1(introw);

voidFun_2(introw);

voidFun_3(introw);

voidFun_4(introw);

voidFun_5(introw);

voidFun_6(introw);

voidFun_7(introw);

voidFun_8(introw);

voidFun_9(introw);

intmain()

{

introw;

cin>>row;

Fun_1(row);

cout

Fun_2(row);

cout

Fun_3(row);

cout

Fun_4(row);

cout

Fun_5(row);

cout

Fun_6(row);

cout

Fun_7(row);

cout

Fun_8(row);

cout

Fun_9(row);

system(

return0;

}

//输出n个空格

voidPrintBlank(intn)

{

for(inti=0;i

cout

}

//使用二维数组输出杨辉三角

voidFun_1(introw)

{

constintDIS=6;

intblank=32;

inta[MAXROW][MAXROW]={0};

for(inti=0;i

{

PrintBlank(blank-=DIS/2);//输出第i行空格

for(intj=0;j

{

if(j==0||j==i)

a[i][j]=1;

else//规律:

左上与正上元素之和

a[i][j]=a[i-1][j-1]+a[i-1][j];

cout

if(j==i)

cout

}

}

}

//使用队列输出杨辉三角

voidFun_2(introw)

{

constintDIS=6;

intmax=row+2;

intblank=30;

int*a=newint[max];

intfront,rear;

front=0;a[0]=1;

rear=1;a[1]=1;

PrintBlank(blank);//输出第一行空格

while(front!

=(rear+1)%max)

{

if(a[front]==1&&a[(front+1)%max]==1)//到i-1行尾部{

rear=(rear+1)%max;a[rear]=1;//第i行尾部

rear=(rear+1)%max;a[rear]=1;//队尾进入第i+1行

cout

front=(front+1)%max;//对头进入第i行PrintBlank(blank-=DIS/2);//输出第i行空格

}

//处理中间数据

rear=(rear+1)%max;a[rear]=a[front]+a[(front+1)%max];if(front!

=rear)//队列非空时输出

cout

front=(front+1)%max;//删除对头元素

}

delete[]a;

}

//使用两个一维数组代替二维数组输出杨辉三角

voidFun_3(introw)

{

constintDIS=6;

intblank=33;

int*a=newint[row];//存储下一行

int*b=newint[row];//存储输出行

b[0]=1;

for(intn=1;n

{

//输出第n行

PrintBlank(blank-=DIS/2);

cout

cout

if(n==row)//已经到最后一行则不再复制

continue;

//生成第n+1行数据

a[0]=b[0];

for(inti=1;i

a[i]=b[i]+b[i-1];

a[n]=1;

//复制第n+1行数据

for(inti=0;i

b[i]=a[i];

}

delete[]a;

delete[]b;

}

//使用一个一维数组和两个临时变量代替二维数组输出杨辉三角:

很巧妙voidFun_4(introw)

{

constintDIS=6;

intblank=30;

int*a=newint[row];//存储输出行

intleft,right;

//输出第一行

PrintBlank(blank);//输出第1行空格

cout

a[0]=1;//左侧数据永远为1

for(intn=1;n

{

left=a[0];

//生成第n行数据

for(inti=1;i

{

right=a[i];

a[i]=left+right;//left=a[i-1],right=a[i]

left=right;

}

a[n]=1;//设置右侧的数据1

//输出第n行

PrintBlank(blank-=DIS/2);

cout

cout

}

delete[]a;

}

//使用一个一维数组和两个临时变量代替二维数组输出杨辉三角:

方法同Fun_4,但更具有技巧,有点难懂

voidFun_5(introw)

{

constintDIS=6;

intblank=33;

int*a=newint[row];//存储输出行

for(inti=1;i

a[0]=1;

intleft,right;

for(intn=1;n

{

left=0;

//生成第n行数据

for(inti=0;i

{

right=a[i];

a[i]=left+right;//left=a[i-1],right=a[i]

left=right;

}

//输出第n行

PrintBlank(blank-=DIS/2);

for(inti=0;i

cout

cout

}

delete[]a;

}

//使用一个一维数组输出杨辉三角;两侧的1不变,计算中间的元素voidFun_6(introw)

{

constintDIS=6;

intblank=30;

int*a=newint[row];

//输出第一行

PrintBlank(blank);//输出第1行空格

cout

a[0]=1;//最左侧为1,永远不变

for(intn=1;n

{

a[n]=1;//设置最右侧的1

for(inti=n-1;i>0;i--)//设置中间的元素,由于a[i]的值变化,故应从右到左计算

{

a[i]+=a[i-1];//杨辉三角的规律

}

//输出第n+1行

PrintBlank(blank-=DIS/2);

for(inti=0;i

cout

cout

}

delete[]a;

}

//使用二项式定理输出杨辉三角

voidFun_7(introw)

{

constintDIS=6;

intblank=30;

//输出第一行

PrintBlank(blank);//输出第1行空格

cout

for(inti=1;i

{

PrintBlank(blank-=DIS/2);//输出第i行空格

for(intj=0;j

{

cout

}

cout

}

//输出组合c(n,m)

intCom(intn,intm)

{

ints1=1;

ints2=1;

m=(m>n/2)?

(n-m):

m;//取小的,以减少计算量

for(inti=1;i

{

s1*=n;

s2*=i;

if(s1%s2==0)//防止溢出

{

s1/=s2;

s2=1;

}

n--;

}

returns1;

}

//使用组合公式推论输出杨辉三角:

C(n,m)=(n-m+1)/m*C(n,m-1)voidFun_8(introw)

{

constintDIS=6;

intblank=30;

//输出第一行

PrintBlank(blank);//输出第1行空格

cout

for(intn=1;n

{

intc=1;

PrintBlank(blank-=DIS/2);//输出第i行空格

cout

for(intm=1;m

{

c=c*(n-m+1)/m;

cout

}

cout

}

//使用递归方法输出杨辉三角:

C(n,k)=1(k=0或者n=k);C(n,k)=C(n-1,k-1)+C(n-1,k)

voidFun_9(introw)

{

constintDIS=6;

intblank=33;

for(intn=0;n

{

PrintBlank(blank-=DIS/2);//输出第i行空格

for(intm=0;m

{

cout

}

cout

}

}

//递归函数,输出杨辉三角:

C(n,k)=1(k=0或者n=k);C(n,k)=C(n-1,k-1)+C(n-1,k)

intTry(intn,intk)

{

if(k==0||k==n)//在左右两侧返回1

return1;

returnTry(n-1,k-1)+Try(n-1,k);//递推公式

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2