算法2.docx
《算法2.docx》由会员分享,可在线阅读,更多相关《算法2.docx(27页珍藏版)》请在冰豆网上搜索。
算法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;jfor(k=0;kif(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;jprintf("%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;is[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;ic[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;ifor(j=0;jres[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;iresult[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;ja[i][j]=m++;
for(j=i+1;ja[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;jprintf("%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-