1、数据结构综合设计实验报告实验报告格式1、 题目:线性表长整数的加减乘除实现2、 完成时间起止2010-12-3-2010-12-43、 实验要求实现线性表长整数的加减乘除(要求最少一千位以上)4、 实验目的通过对长整数加减乘除的实现,深入了解线性表的优势与劣势,同时增强对数据结构实践能力的培养,加强计算机动手能力。5、 实验过程5.1 系统的主控模块流程图#includeFile1.cppint main()list a,b,c;init(c);init(a);cout两个数a,b:;create(a);init(b);create(b);couta.a+b.a=;add(a,b,c);dis
2、play(c);couta.a-b.a=;init(c);thus(a,b,c);display(c);couta.a*b.a=;init(c);multipy(a,b,c);display(c);init(c);couta.a/b.a=;division(a,b,c);display(c);system(pause); 5.2 主要模块流程图首先线性表基本函数#includeusing namespace std;const int maxsize=1000;typedef char elemtype;struct listelemtype* a;int size;void init(lis
3、t& m)m.a=new elemtypemaxsize;m.size=0;void create(list& m)coutm.a;m.size=strlen(m.a);int getsize(list m)return m.size;bool empty(list m)return m.size=0;void display(list m)for(int i=0;im.size;i+)coutm.ai;coutendl;用于下面计算的基础函数void reverse(list& m)for(int i=0;i=b.size)return true;return false;void copy
4、(list& a,list b)a.size=b.size;for(int i=0;ib.size;i+)a.ai=b.ai;a.aa.size=0;void clearfirst(list& a) /用来清除数组前面的0int i=0,k=0;bool t=false;if(a.a0!=-&a.a0!=0)return;else if(a.a0=-) i=1;t=true;for(;ia.size;i+)if(a.ai=0)k+;else break;list b;init(b);copy(b,a);init(a);b.ab.size=0;a.size=b.size-k;if(t=false
5、) /t为false时 ,说明a为正for(int tz=0;tzb.size;tz+)a.atz=b.atz+k;elsea.a0=-;for(int tz=0;tza.size;tz+)a.atz+1=b.ak+tz+1;a.aa.size=0;void ch(list& a,int x) /乘以10 相当于移位for(int i=0;ix;i+)a.aa.size+i=0;a.size=a.size+x;a.aa.size=0;void reverse(list& m)/倒置for(int i=0;im.size/2;i+)elemtype t=m.ai;m.ai=m.am.size-i
6、-1;m.am.size-i-1=t;1大整数加法 void add(list a,list b,list& c) /加法/if(!empty(c)reverse(c);reverse(a);reverse(b);int i,k,flag=0,sun;if(compare(a,b)c.size=a.size;for(i=0;i=10)flag=sun/10;sun%=10;else flag=0;c.ai=sun+0; for(i=b.size;i=10)flag=sun/10;sun%=10;else flag=0;c.ai=sun+0; if(flag!=0)c.ac.size+=0+fl
7、ag;flag=0; elsec.size=b.size;for(i=0;i=10)flag=sun/10;sun%=10;else flag=0;c.ai=sun+0; for(i=a.size;i=10)flag=sun/10;sun%=10;else flag=0;c.ai=sun+0; if(flag!=0)c.ac.size+=0+flag;flag=0; c.ac.size=0;reverse(a);reverse(b);reverse(c);减法 void thus(list wg,list tg,list& c) /减法bool zf=true;list a,b; /创建临时a
8、,b用于操作init(a);init(b);copy(a,wg);copy(b,tg);int i,k,flag=0,sun; if(strlen(a.a)strlen(b.a) /大数减小数 reverse(a);reverse(b);for(i=0;istrlen(b.a);i+) a.ai-=flag/10; if(a.aib.ai)flag=10; else flag=0; sun=a.ai-b.ai+flag+0; c.ai=sun; for(i=strlen(b.a);istrlen(a.a);i+) a.ai-=flag/10; flag=0; c.ai=a.ai; c.size
9、=i; c.ai=0;else if(strlen(a.a)=strlen(b.a) /位数相等int w; bool tf=false;for(w=0;wa.size;w+) if(a.awb.aw)tf=false; break; else if(a.aw=b.aw)continue;else tf=true;break; reverse(a);reverse(b);if(tf=true& w=a.size&d!=a.size) /位数相等,大数减小数 for(i=0;istrlen(b.a);i+) a.ai-=flag/10; if(a.aib.ai)flag=10; else fla
10、g=0; sun=a.ai-b.ai+flag+0; c.ai=sun; for(i=strlen(b.a);i=a.size) init(c); c.size=1; c.a0=0; c.ac.size=0;return; else /位数相等,小数减大数 for(i=0;ib.ai)flag=10; else flag=0; sun=b.ai-a.ai+flag+0; c.ai=sun; for(i=strlen(a.a);istrlen(b.a);i+) b.ai-=flag/10; flag=0; c.ai=b.ai; zf=false; c.size=i; c.ai=0; else i
11、f(strlen(a.a)strlen(b.a) reverse(a);reverse(b); for(i=0;ib.ai)flag=10; else flag=0; sun=b.ai-a.ai+flag+0; c.ai=sun; for(i=strlen(a.a);istrlen(b.a);i+) b.ai-=flag/10; c.ai=b.ai; zf=false; c.size=i; c.ai=0; reverse(c);if(zf=false) /符号判断list m;init(m);copy(m,c);init(c); c.size=m.size+1;c.a0=-;for(i=0;i
12、m.size;i+)c.ai+1=m.ai;c.ai+1=0;clearfirst(c);void multipy(list wg,list tg,list& c ) /乘法list a,b; /创建临时a,b用于操作init(a);init(b);copy(a,wg);copy(b,tg);reverse(a);reverse(b);for(int m=0;mstrlen(a.a)+strlen(b.a);m+)c.am=0;c.size=strlen(a.a)+strlen(b.a);int i,k,sum,flag=0;for(i=0;istrlen(b.a);+i)if(b.ai=0)
13、continue;sum=0;for(k=0;kstrlen(a.a);+k)sum+=(a.ak-0)*(b.ai-0)+(c.ak+i-0);c.ak+i=sum%10+0; /进位计算sum/=10;flag=sum;c.astrlen(a.a)+i+=sum;c.ac.size=0;reverse(a);reverse(b);reverse(c);clearfirst(c);除法void division(list wg,list tg,list& c) /除法list a,b; /创建临时a,b用于操作init(a);init(b);copy(a,wg);copy(b,tg);int
14、 i,j; list t,v,k,m;if(empty(b)|empty(a)return;if(strlen(a.a)=strlen(b.a) /如果a和b长度相等for(i=0;i9;i+) init(k); /thus(a,b,k);if(k.a0!=-) init(a); copy(a,k); continue; else break;init(c);c.size=1;c.a0=i+0;c.ac.size=0;else if(strlen(a.a)strlen(b.a) /如果a比b大int qwt=strlen(a.a)-strlen(b.a);for(j=0;j=qwt;j+)in
15、it(m);int grf=0;thus(a,b,m);if(m.a0=-)grf+;init(v);copy(v,b);ch(v,qwt-j-grf); for(i=0;i9;i+) init(k); / thus(a,v,k); if(k.a0!=-) init(a); copy(a,k); continue; else break; c.aj=i+0;c.size+;if(strlen(a.a)=strlen(b.a)for(i=0;i9;i+) init(k); /thus(a,b,k);if(k.a0!=-) init(a); copy(a,k); continue; else br
16、eak;if(jqwt)c.ac.size=i+0; c.size+; c.ac.size=0; clearfirst(c);5.3 测试例子测试实例普通加法加法进位等位加法等位减法大数减小数小数减大数小数乘大数大数乘小数大数除小数等位数相同除法高位计算千位级别计算(时间大约1s不到)算法性能优良接上面5.4 设计中碰到的问题,如何解决实验过程中多次碰到数组空间内存溢出的问题,除法运算效率问题,还有计算过程中算法重利用不高的问题,我多次实验,并通过完善,通过分模块执行代码进行整合,最终解决了一些已知的问题。6、 实验结果和心得体会通过这次综合设计,我对数组了解更深刻了,同时对内存空间的结构也更加深刻了,在实践能力上得到很大的提高,同时也了解了线性表的结构与功能!在千位级别的计算过程中由于受到数组输入的限制,无法测试由于无法和string比较,所以string性能未知!千位级别计算(时间大约1s不到)算法性能优良,在1024位乘以1024位,计算过程中,由于受到程序的限制,内存最多能够读入大小限制,不能实现1000-2000位的计算
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1