数据结构综合设计实验报告.docx
- 文档编号:4480189
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:22
- 大小:523.76KB
数据结构综合设计实验报告.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;i cout< 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;i a.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(;i if(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;tz a.a[tz]=b.a[tz+k]; } else{ a.a[0]='-'; for(inttz=0;tz a.a[tz+1]=b.a[k+tz+1]; } a.a[a.size]=='\0'; }voidch(list&a,intx){//乘以10相当于移位 for(inti=0;i a.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;i sun=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;i sun=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;i sun=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;i sun=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;w if(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)//位数相等,大数减小数 { 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;i c.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;m c.a[m]='0'; c.size=strlen(a.a)+strlen(b.a); inti,k,sum,flag=0; for(i=0;i if(b.a[i]=='0')continue; sum=0; for(k=0;k sum+=(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(j c.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位的计算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 综合 设计 实验 报告