数据结构综合设计实验报告.docx

上传人:b****6 文档编号:4480189 上传时间:2022-12-01 格式:DOCX 页数:22 大小:523.76KB
下载 相关 举报
数据结构综合设计实验报告.docx_第1页
第1页 / 共22页
数据结构综合设计实验报告.docx_第2页
第2页 / 共22页
数据结构综合设计实验报告.docx_第3页
第3页 / 共22页
数据结构综合设计实验报告.docx_第4页
第4页 / 共22页
数据结构综合设计实验报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

数据结构综合设计实验报告.docx

《数据结构综合设计实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构综合设计实验报告.docx(22页珍藏版)》请在冰豆网上搜索。

数据结构综合设计实验报告.docx

数据结构综合设计实验报告

实验报告格式

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<

}

 

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&&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;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位的计算

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

当前位置:首页 > 高中教育 > 英语

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

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