算法2.docx

上传人:b****7 文档编号:11367522 上传时间:2023-02-28 格式:DOCX 页数:27 大小:20.46KB
下载 相关 举报
算法2.docx_第1页
第1页 / 共27页
算法2.docx_第2页
第2页 / 共27页
算法2.docx_第3页
第3页 / 共27页
算法2.docx_第4页
第4页 / 共27页
算法2.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

算法2.docx

《算法2.docx》由会员分享,可在线阅读,更多相关《算法2.docx(27页珍藏版)》请在冰豆网上搜索。

算法2.docx

算法2

1蛇形矩阵:

#include

#defineN20

intmain()

{

intn,i,j,k,a[N][N];

intcount=0;

scanf("%d",&n);

for(i=1;i<=2*n-1;++i)

{

if(i%2==0)

{

for(j=0;j

for(k=0;k

if(i-1==j+k)

a[j][k]=++count;

}

else

{

for(j=n-1;j>=0;--j)

for(k=n-1;k>=0;--k)

if(i-1==j+k)

a[j][k]=++count;

}

}

for(i=0;i

{

for(j=0;j

printf("%4d",a[i][j]);

printf("\n");

}

return0;

}

2求大整数的阶乘

#include

intmain()

{

longa[10000];

intn,m,i,j,c;

scanf("%d",&n);

m=0;

a[0]=1;

for(i=1;i<=n;++i)

{

c=0;

for(j=0;j<=m;++j)

{

a[j]=a[j]*i+c;

c=a[j]/100000;

a[j]=a[j]%100000;

}

if(c>0)

{

m++;

a[m]=c;

}

}

printf("%ld",a[m]);

for(i=m-1;i>=0;--i)

printf("%05ld",a[i]);

printf("\n");

return0;

}

3.大数乘小数

#include

#include

intmain()

{

charc[1000];

ints[1000],m,n,t,k,i,flag=0;t=0;

scanf("%d",&m);

getchar();

gets(c);

n=strlen(c);

for(i=0;i

s[n-i-1]=c[i]-'0';

for(i=0;i

{

k=s[i]*m+t;

if(k>=10)

{

t=k/10;

s[i]=k%10;

flag=1;

}

else

{

t=0;

s[i]=k;

flag=0;

}

}

if(flag)

{

n++;

s[i]=t;

}

for(i=0;i

c[n-1-i]=s[i]+'0';

c[i]='\0';

puts(c);

return0;

}

4.求大整数的阶乘的位数

#include

#include

intmain()

{

intn,i,m=0;

floatf1=0;

scanf("%d",&n);

for(i=1;i<=n;++i)

f1+=log10(i);

m=f1;

printf("%d\n",m+1);

return0;

}

5大数乘大数

#include

#include

voidmain()

{

inti,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;

charresult[65],a[1000],b[1000],s[1000];

gets(a);gets(b);

alen=strlen(a);

blen=strlen(b);

for(i=0;i

for(j=0;j

res[i][j]=(a[i]-'0')*(b[j]-'0');

for(i=alen-1;i>=0;i--)

{

for(j=blen-1;j>=0;j--)

sum=sum+res[i+blen-j-1][j];

result[k]=sum%10;

k=k+1;

sum=sum/10;

}

for(i=blen-2;i>=0;i--)

{

for(j=0;j<=i;j++)

sum=sum+res[i-j][j];

result[k]=sum%10;

k=k+1;

sum=sum/10;

}

if(sum!

=0)

{

result[k]=sum;

k=k+1;

}

for(i=0;i

result[i]+='0';

for(i=k-1;i>=0;i--)

s[i]=result[k-1-i];

s[k]='\0';

while

(1)

{

if(strlen(s)!

=strlen(a)&&s[0]=='0')

strcpy(s,s+1);

else

break;

}

puts(s);

}

6.螺旋矩阵

#include

intconstn=7;

intmain()

{

inta[n][n],i,j,m=1;

for(i=0;i<=n/2;++i)

{

for(j=i;j

a[i][j]=m++;

for(j=i+1;j

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

for(j=n-i-2;j>=i;j--)

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

for(j=n-2-i;j>=i+1;--j)

a[j][i]=m++;

}

for(i=0;i

{

for(j=0;j

printf("%4d",a[i][j]);

printf("\n");

}

return0;

}

7.精度计算加法

#include

#include

intmain()

{

chara[10000],b[10000];

ints=0,k=0,x,y,l,m,n;

gets(a);gets(b);

x=strlen(a);y=strlen(b);

charc[10002];

while(x>0||y>0)

{

if(x<=0)

m=0;

else

m=a[(x--)-1]-'0';

if(y<=0)

n=0;

else

n=b[(y--)-1]-'0';

s=s+m+n;

if(s>9)

{

c[k++]=s%10+'0';

s=s/10;

}

else

{

c[k++]=s+'0';

s=0;

}

}

if(s)

c[k++]=s+'0';

c[k]='\0';

for(k=k-1;k>=0;--k)

putchar(c[k]);

printf("\n");

return0;

}

8.树的双亲存储结构

#include

#include

#definemaxsize20

#include

usingnamespacestd;

typedefstruct 

{

   chardata;

 intparent;//双亲位置

}pnode;

typedefstruct

{

 pnodes[maxsize];

 intn; //结点数;

}ptree;

//初始化,也可以不初始化

voidinittree(ptree&T)

{  

T.n=0;

//创建并存储

voidcreate(ptree&T)

{   

 

 inti;

 cout<<"请输入节点数:

";

 cin>>T.n;

 cout<<"请输入节点基本信息->节点的值,双亲位置(根节点的双亲位置为-1):

";

 for(i=0;i

 {

  cin>>T.s[i].data>>T.s[i].parent;

 }

}

//查找c的父亲

voidreserch(ptree&T,charc)

{   

 

 for(inti=0;i

 {

  if(T.s[i].data==c)  //有二种情况;有可能为根节点;有可能不是根节点;

  {

   

   if(T.s[i].parent>=0)

   { 

    cout<<"其父亲为:

";

    cout<

    break; //因为父亲只有一个找到后立即结束整个for(inti=0;i

   }

   else 

   {

    cout<<"其为根节点所以没有父亲"<

    break;

   }

  }

  elseif(T.s[i].data!

=c&&i>=T.n-1) ////在整个数组中层层寻找字符c,并且寻遍整个数组(i>=T.n-1为界)都没找到

  {

   cout<<"该字符不在范围内"<

  }

  

 }

 

}

//查找c的孩子

voidreserch2(ptree&T,charc)

{   

 

 for(inti=0;i

 {

  if(T.s[i].data==c)//找到c;有二种情况:

有左右孩子或左孩子或右孩子的节点;为叶子;

  {   

   intm=0;//记录孩子的个数

   for(intj=0;j

   {   

    

    if(T.s[j].parent==i)

    {  

     m++;  

     cout<<"其孩子为:

";

     cout<

    }//可能有多个孩子所以找到一个孩子后没有结束整个for(intj=0;j

    elseif(T.s[j].parent!

=i&&j>=T.n-1&&m==0)//确定其为叶子;因为如果没有m=0,即便查找的字符不是叶子而整个数组最后一个字符即使

    {                                        //不是其孩子也满足T.s[j].parent!

=i&&j>=T.n-1,也会输出语句"其为叶子所以没有孩子";

     cout<<"其为叶子所以没有孩子"<

    }

   }

   break;//找到c并且找到了的孩子后结束整个for(inti=0;i

  }

  

  else if(T.s[i].data!

=c&&i>=T.n-1) //在整个数组中层层寻找字符c,并且寻遍整个数组(i>=T.n-1为界)都没找到

  {

   cout<<"该字符不在范围内"<

  }

  

 }

 

}

//打印

voidprint(ptree&T)

{

 for(inti=0;i

  cout<

   

}

voidmain()

{   

 charc;

 ptreeT;

 create(T);

 cout<<"您刚才输入的基本信息为:

"<

   print(T);

 cout<<"请输入要查找父亲的字符:

"<

   while((cin>>c&&c!

='n')) //当输入的字符为n时结束循环

 { 

   reserch(T,c);

   cout<<"请输入要查找孩子的字符:

"<

 cin>>c;

   reserch2(T,c);

 cout<<"请输入要查找父亲的字符:

"<

 }

  

}

9.树的二叉链表(孩子-兄弟)存储表示

typedefstructCSNode

{

TElemTypedata;

CSNode*firstchild,*nextsibling;

}CSNode,*CSTree;

//bo6-5.cpp树的二叉链表(孩子-兄弟)存储(存储结构由c6-5.h定义)的基本操作(17个)

StatusInitTree(CSTree&T)

{//操作结果:

构造空树T

T=NULL;

returnOK;

}

voidDestroyTree(CSTree&T)

{//初始条件:

树T存在。

操作结果:

销毁树T

if(T)

{

if(T->firstchild)//T有长子

DestroyTree(T->firstchild);//销毁T的长子为根结点的子树

if(T->nextsibling)//T有下一个兄弟

DestroyTree(T->nextsibling);//销毁T的下一个兄弟为根结点的子树

free(T);//释放根结点

T=NULL;

}

}

typedefCSTreeQElemType;//定义队列元素类型

#include"c3-2.h"//定义LinkQueue类型

#include"bo3-2.cpp"//LinkQueue类型的基本操作

StatusCreateTree(CSTree&T)

{//构造树T

charc[20];//临时存放孩子结点(设不超过20个)的值

CSTreep,p1;

LinkQueueq;

inti,l;

InitQueue(q);

printf("请输入根结点(字符型,空格为空):

");

scanf("%c%*c",&c[0]);

if(c[0]!

=Nil)//非空树

{

T=(CSTree)malloc(sizeof(CSNode));//建立根结点

T->data=c[0];

T->nextsibling=NULL;

EnQueue(q,T);//入队根结点的指针

while(!

QueueEmpty(q))//队不空

{

DeQueue(q,p);//出队一个结点的指针

printf("请按长幼顺序输入结点%c的所有孩子:

",p->data);

gets(c);

l=strlen(c);

if(l>0)//有孩子

{

p1=p->firstchild=(CSTree)malloc(sizeof(CSNode));//建立长子结点

p1->data=c[0];

for(i=1;i

{

p1->nextsibling=(CSTree)malloc(sizeof(CSNode));//建立下一个兄弟结点

EnQueue(q,p1);//入队上一个结点

p1=p1->nextsibling;

p1->data=c[i];

}

p1->nextsibling=NULL;

EnQueue(q,p1);//入队最后一个结点

}

else

p->firstchild=NULL;

}

}

else

T=NULL;

returnOK;

}

#defineClearTreeDestroyTree//二者操作相同

StatusTreeEmpty(CSTreeT)

{//初始条件:

树T存在。

操作结果:

若T为空树,则返回TURE,否则返回FALSE

if(T)//T不空

returnFALSE;

else

returnTRUE;

}

intTreeDepth(CSTreeT)

{//初始条件:

树T存在。

操作结果:

返回T的深度

CSTreep;

intdepth,max=0;

if(!

T)//树空

return0;

if(!

T->firstchild)//树无长子

return1;

for(p=T->firstchild;p;p=p->nextsibling)

{

depth=TreeDepth(p);

if(depth>max)

max=depth;

}

returnmax+1;

}

TElemTypeValue(CSTreep)

{//返回p所指结点的值

returnp->data;

}

TElemTypeRoot(CSTreeT)

{//初始条件:

树T存在。

操作结果:

返回T的根

if(T)

returnValue(T);

else

returnNil;

}

CSTreePoint(CSTreeT,TElemTypes)

{//返回二叉链表(孩子-兄弟)树T中指向元素值为s的结点的指针。

另加

LinkQueueq;

QElemTypea;

if(T)//非空树

{

InitQueue(q);//初始化队列

EnQueue(q,T);//根结点入队

while(!

QueueEmpty(q))//队不空

{

DeQueue(q,a);//出队,队列元素赋给a

if(a->data==s)

returna;

if(a->firstchild)//有长子

EnQueue(q,a->firstchild);//入队长子

if(a->nextsibling)//有下一个兄弟

EnQueue(q,a->nextsibling);//入队下一个兄弟

}

}

returnNULL;

}

StatusAssign(CSTree&T,TElemTypecur_e,TElemTypevalue)

{//初始条件:

树T存在,cur_e是树T中结点的值。

操作结果:

改cur_e为value

CSTreep;

if(T)//非空树

{

p=Point(T,cur_e);//p为cur_e的指针

if(p)//找到cur_e

{

p->data=value;//赋新值

returnOK;

}

}

returnNil;//树空或没找到

}

TElemTypeParent(CSTreeT,TElemTypecur_e)

{//初始条件:

树T存在,cur_e是T中某个结点

//操作结果:

若cur_e是T的非根结点,则返回它的双亲,否则函数值为"空"

CSTreep,t;

LinkQueueq;

InitQueue(q);

if(T)//树非空

{

if(Value(T)==cur_e)//根结点值为cur_e

returnNil;

EnQueue(q,T);//根结点入队

while(!

QueueEmpty(q))

{

DeQueue(q,p);

if(p->firstchild)//p有长子

{

if(p->firstchild->data==cur_e)//长子为cur_e

returnValue(p);//返回双亲

t=p;//双亲指针赋给t

p=p->firstchild;//p指向长子

EnQueue(q,p);//入队长子

while(p->nextsibling)//有下一个兄弟

{

p=p->nextsibling;//p指向下一个兄弟

if(Value(p)==cur_e)//下一个兄弟为cur_e

returnValue(t);//返回双亲

EnQueue(q,p);//入队下一个兄弟

}

}

}

}

returnNil;//树空或没找到cur_e

}

TElemTypeLeftChild(CSTreeT,TElemTypecur_e)

{//初始条件:

树T存在,cur_e是T中某个结点

//操作结果:

若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回"空"

CSTreef;

f=Point(T,cur_e);//f指向结点cur_e

if(f&&f->firstchild)//找到结点cur_e且结点cur_e有长子

returnf->firstchild->data;

else

returnNil;

}

TElemTypeRightSibling(CSTreeT,TElemTypecur_e)

{//初始条件:

树T存在,cur_e是T中某个结点

//操作结果:

若cur_e有右兄弟,则返回它的右兄弟,否则返回"空"

CSTreef;

f=Point(T,cur_e);//f指向结点cur_e

if(f&&f->nextsibling)//找到结点cur_e且结点cur_e有右兄弟

returnf->nextsibling->data;

else

returnNil;//树空

}

StatusInsertChild(CSTree&T,CSTreep,inti,CSTreec)

{//初始条件:

树T存在,p指向T中某个结点,1≤i≤p所指结点的度+1,非空树c与T不相交

//操作结果:

插入c为T中p结点的第i棵子树

//因为p所指结点的地址不会改变,故p不需是引用类型

intj;

if(T)//T不空

{

if(i==1)//插入c为p的长子

{

c->nextsibling=p->firstchild;//p的原长子现是c的下一个兄弟(c本无兄弟)

p->firstchild=c;

}

else//找插入点

{

p=p->firstchild;//指向p的长子

j=2;

while(p&&j

{

p=p->nextsibling;

j++;

}

if(j==i)//找到插入位置

{

c-

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

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1