数据结构综合设计实验报告.docx
《数据结构综合设计实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构综合设计实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构综合设计实验报告
实验报告格式
1、题目:
线性表长整数的加减乘除实现
2、完成时间起止
2010-12-3-----------2010-12-4
3、实验要求
实现线性表长整数的加减乘除(要求最少一千位以上)
4、实验目的
通过对长整数加减乘除的实现,深入了解线性表的优势与劣势,同时增强对数据结构实践能力的培养,加强计算机动手能力。
5、实验过程
5.1系统的主控模块流程图
#include"File1.cpp"
intmain(){
lista,b,c;
init(c);
init(a);
cout<<"两个数a,b:
";
create(a);
init(b);
create(b);
cout<add(a,b,c);
display(c);
cout<init(c);
thus(a,b,c);
display(c);
cout<init(c);
multipy(a,b,c);
display(c);
init(c);
cout<division(a,b,c);
display(c);
system("pause");
}
5.2主要模块流程图
首先线性表基本函数
#include
usingnamespacestd;
constintmaxsize=1000;
typedefcharelemtype;
structlist{
elemtype*a;
intsize;
};
voidinit(list&m){
m.a=newelemtype[maxsize];
m.size=0;
}
voidcreate(list&m){
cout<<"请输入一个长整数:
";
cin>>m.a;
m.size=strlen(m.a);
}
intgetsize(listm){
returnm.size;
}
boolempty(listm){
returnm.size==0;}
voiddisplay(listm){
for(inti=0;icout<cout<}用于下面计算的基础函数
voidreverse(list&m){
for(inti=0;i{elemtypet=m.a[i];
m.a[i]=m.a[m.size-i-1];
m.a[m.size-i-1]=t;
}
}
boolcompare(lista,listb){
if(a.size>=b.size)returntrue;
returnfalse;
}
voidcopy(list&a,listb){
a.size=b.size;
for(inti=0;ia.a[i]=b.a[i];
a.a[a.size]='\0';
}
voidclearfirst(list&a){//用来清除数组前面的0
inti=0,k=0;boolt=false;
if(a.a[0]!
='-'&&a.a[0]!
='0')return;
elseif(a.a[0]=='-'){
i=1;t=true;}
for(;iif(a.a[i]=='0')k++;
elsebreak;
listb;init(b);
copy(b,a);init(a);
b.a[b.size]='\0';
a.size=b.size-k;
if(t==false){//t为false时,说明a为正
for(inttz=0;tza.a[tz]=b.a[tz+k];
}
else{
a.a[0]='-';
for(inttz=0;tza.a[tz+1]=b.a[k+tz+1];
}
a.a[a.size]=='\0';
}voidch(list&a,intx){//乘以10相当于移位
for(inti=0;ia.a[a.size+i]='0';
a.size=a.size+x;
a.a[a.size]=0;
}
voidreverse(list&m){//倒置
for(inti=0;i{elemtypet=m.a[i];
m.a[i]=m.a[m.size-i-1];
m.a[m.size-i-1]=t;
}
}
1大整数加法
voidadd(lista,listb,list&c){//加法
//if(!
empty(c)){reverse(c);}
reverse(a);
reverse(b);
inti,k,flag=0,sun;
if(compare(a,b)){
c.size=a.size;
for(i=0;isun=a.a[i]-'0'+b.a[i]-'0'+flag;
if(sun>=10){flag=sun/10;sun%=10;}
elseflag=0;
c.a[i]=sun+'0';}
for(i=b.size;isun=b.a[i]-'0'+flag;
if(sun>=10){flag=sun/10;sun%=10;}
elseflag=0;
c.a[i]=sun+'0';
}
if(flag!
=0){c.a[c.size++]='0'+flag;flag=0;}
}
else{
c.size=b.size;
for(i=0;isun=a.a[i]-'0'+b.a[i]-'0'+flag;
if(sun>=10){flag=sun/10;sun%=10;}
elseflag=0;
c.a[i]=sun+'0';}
for(i=a.size;isun=a.a[i]-'0'+flag;
if(sun>=10){flag=sun/10;sun%=10;}
elseflag=0;
c.a[i]=sun+'0';
}
if(flag!
=0){c.a[c.size++]='0'+flag;flag=0;}
}
c.a[c.size]='\0';
reverse(a);
reverse(b);
reverse(c);
}
减法
voidthus(listwg,listtg,list&c){//减法
boolzf=true;
lista,b;//创建临时a,b用于操作
init(a);init(b);
copy(a,wg);copy(b,tg);
inti,k,flag=0,sun;
if(strlen(a.a)>strlen(b.a))//大数减小数
{
reverse(a);
reverse(b);
for(i=0;i{a.a[i]-=flag/10;
if(a.a[i]elseflag=0;
sun=a.a[i]-b.a[i]+flag+'0';
c.a[i]=sun;}
for(i=strlen(b.a);i{a.a[i]-=flag/10;flag=0;
c.a[i]=a.a[i];}
c.size=i;
c.a[i]='\0';
}
elseif(strlen(a.a)==strlen(b.a))//位数相等
{
intw;booltf=false;
for(w=0;wif(a.a[w]elseif(a.a[w]==b.a[w])continue;
else{tf=true;break;}
reverse(a);
reverse(b);
if(tf==true&&w=a.size&&d!
=a.size)//位数相等,大数减小数
{
for(i=0;i{a.a[i]-=flag/10;
if(a.a[i]elseflag=0;
sun=a.a[i]-b.a[i]+flag+'0';
c.a[i]=sun;}
for(i=strlen(b.a);i{a.a[i]-=flag/10;flag=0;
c.a[i]=a.a[i];}
c.size=i;
c.a[i]='\0';
}
elseif(w>=a.size){
init(c);
c.size=1;
c.a[0]='0';
c.a[c.size]='\0';
return;
}
else//位数相等,小数减大数
{
for(i=0;i{b.a[i]-=flag/10;
if(a.a[i]>b.a[i])flag=10;
elseflag=0;
sun=b.a[i]-a.a[i]+flag+'0';
c.a[i]=sun;}
for(i=strlen(a.a);i{b.a[i]-=flag/10;flag=0;
c.a[i]=b.a[i];}
zf=false;
c.size=i;
c.a[i]='\0';
}
}
elseif(strlen(a.a)reverse(a);
reverse(b);
for(i=0;i{b.a[i]-=flag/10;
if(a.a[i]>b.a[i])flag=10;
elseflag=0;
sun=b.a[i]-a.a[i]+flag+'0';
c.a[i]=sun;}
for(i=strlen(a.a);i{b.a[i]-=flag/10;
c.a[i]=b.a[i];}
zf=false;
c.size=i;
c.a[i]='\0';
}
reverse(c);
if(zf==false){//符号判断
listm;init(m);
copy(m,c);init(c);c.size=m.size+1;
c.a[0]='-';
for(i=0;ic.a[i+1]=m.a[i];
}
c.a[i+1]='\0';
clearfirst(c);
}
voidmultipy(listwg,listtg,list&c){//乘法
lista,b;//创建临时a,b用于操作
init(a);init(b);
copy(a,wg);copy(b,tg);
reverse(a);
reverse(b);
for(intm=0;mc.a[m]='0';
c.size=strlen(a.a)+strlen(b.a);
inti,k,sum,flag=0;
for(i=0;iif(b.a[i]=='0')continue;
sum=0;
for(k=0;ksum+=(a.a[k]-'0')*(b.a[i]-'0')+(c.a[k+i]-'0');
c.a[k+i]=sum%10+'0';//进位计算
sum/=10;
flag=sum;
}
c.a[strlen(a.a)+i]+=sum;
}
c.a[c.size]='\0';
reverse(a);
reverse(b);
reverse(c);
clearfirst(c);
}
除法
voiddivision(listwg,listtg,list&c){//除法
lista,b;//创建临时a,b用于操作
init(a);init(b);
copy(a,wg);copy(b,tg);
inti,j;listt,v,k,m;
if(empty(b)||empty(a))return;
if(strlen(a.a)==strlen(b.a)){//如果a和b长度相等
for(i=0;i<9;i++)
{init(k);//
thus(a,b,k);
if(k.a[0]!
='-'){
init(a);
copy(a,k);
continue;
}
elsebreak;
}
init(c);
c.size=1;
c.a[0]=i+'0';
c.a[c.size]='\0';
}
elseif(strlen(a.a)init(c);
c.size=1;
c.a[0]='0';
c.a[c.size]='\0';
return;
}
elseif(strlen(a.a)>strlen(b.a)){//如果a比b大
intqwt=strlen(a.a)-strlen(b.a);
for(j=0;j<=qwt;j++){
init(m);
intgrf=0;
thus(a,b,m);if(m.a[0]=='-')grf++;
init(v);copy(v,b);
ch(v,qwt-j-grf);
for(i=0;i<9;i++)
{init(k);//
thus(a,v,k);
if(k.a[0]!
='-'){
init(a);
copy(a,k);
continue;
}
elsebreak;
}
c.a[j]=i+'0';
c.size++;
}
if(strlen(a.a)==strlen(b.a)){
for(i=0;i<9;i++)
{init(k);//
thus(a,b,k);
if(k.a[0]!
='-'){
init(a);
copy(a,k);
continue;
}
elsebreak;
}
if(jc.a[c.size]=i+'0';
c.size++;}
}
c.a[c.size]='\0';
}
clearfirst(c);
}
5.3测试例子
测试实例
普通加法
加法进位
等位加法
等位减法
大数减小数
小数减大数
小数乘大数
大数乘小数
大数除小数
等位数相同除法
高位计算
千位级别计算(时间大约1s不到)
算法性能优良
接上面
5.4设计中碰到的问题,如何解决
实验过程中多次碰到数组空间内存溢出的问题,除法运算效率问题,还有计算过程中算法重利用不高的问题,我多次实验,并通过完善,通过分模块执行代码进行整合,最终解决了一些已知的问题。
6、实验结果和心得体会
通过这次综合设计,我对数组了解更深刻了,同时对内存空间的结构也更加深刻了,在实践能力上得到很大的提高,同时也了解了线性表的结构与功能!
在千位级别的计算过程中由于受到数组输入的限制,无法测试
由于无法和string比较,所以string性能未知!
千位级别计算(时间大约1s不到)
算法性能优良,
在1024位乘以1024位,计算过程中,由于受到程序的限制,内存最多能够读入大小限制,不能实现1000-2000位的计算