数据结构大型实验大整数运算系统附源代码图文Word格式文档下载.docx
- 文档编号:20915282
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:125
- 大小:240.34KB
数据结构大型实验大整数运算系统附源代码图文Word格式文档下载.docx
《数据结构大型实验大整数运算系统附源代码图文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构大型实验大整数运算系统附源代码图文Word格式文档下载.docx(125页珍藏版)》请在冰豆网上搜索。
•要求采用多文件方式:
.h文件存储类的声明,.cpp文件存储类的实现,主函数main存
储在另外一个单独的cpp文件中。
如果采用类模板,则类的声明和实现都放在.h文件中;
•要求源程序中有相应注释;
•不强制要求采用类模板,也不要求采用可视化窗口;
•要求测试例子要比较详尽,各种极限¯
况也要考虑到,测试的输出信o要详细易懂,表明各个功能的执行正确;
•要求采用VisualC++6.0及以上版本进行调试。
设计思路
–根据题目要求,用链表来实现大整数的存储,用大整数类Long_Num并实现一些基本操作,设计界面菜单类LN_menu来显示界面;
然后,在main函数中来完成各种操作与检验。
第二部分具体实现
链表类及大数类的部分说明以及部分源码
链表类:
List由使用指针连接的节点组成,每个节点都保存着数据,以及指向前驱和后继的指针。
每个节点中存储一个数字表示大数的一位。
源代码:
node:
:
node(
{
next=NULL;
pre=NULL;
}
node(intp//节点构造函数
value=p;
大数类:
大数类有一个头节点和尾节点,分别为head和back,而back的下一个节点为NULL。
当head与back指向同一位置时表示List为只含一个节点。
Head与back都为NULL表示List为空。
而且用一个int类型的变量存储大数的长度,为以后的运算提供便利。
构造函数:
Long_Num:
Long_Num(//构造函数
head=NULL;
back=NULL;
len=0;
•Long_Num(默认构造函数。
voidLong_Num:
equal(Long_Numtemp//复制构造函数,将形参复制给当前对象,而非地址传递
node*p=temp.head;
len=temp.len;
head=newnode(p->
value;
back=head;
p=p->
next;
while(p
node*Newnode=newnode(p->
back->
next=Newnode;
Newnode->
pre=back;
back=back->
•voidequal(Long_Numtemp用equal代替了构造函数。
length(//更正对象长度并规范大整数
node*p=head;
intn_len=0;
while(p->
next
if(p->
value==0
head=head->
head->
else
break;
n_len++;
len=n_len;
•voidlength(把大整数运算过后前面的0去掉,并且更正len长度。
boolLong_Num:
equalto(Long_Numtemp//判断两大整数是否相等
node*p1=head,*p2=temp.head;
boolflag=true;
while(flag&
&
p1
if(p1->
value!
=p2->
value
flag=false;
p1=p1->
p2=p2->
returnflag;
•voidequalto(Long_Numtemp判断两大整数是否相等
print(//打印十进制数并存储
if(head==NULL
cout<
<
"
******数据为空!
********"
ofstreamoutfile;
outfile.open("
output_Num.txt"
ios:
app;
value;
outfile<
•voidprint(打印并存储十进制数据。
print2(//打印二进制数并存储数据
output2_Num.txt"
•voidprint2(打印并存储二进制数据。
compare(Long_Numtemp//初级比较,只用于长度相等的大正间的比较,大于等于返回true
boolflag=false;
node*temp1=head,*temp2=temp.head;
while(temp1
if(temp1->
=temp2->
flag=temp1->
value>
temp2->
value?
true:
false;
temp1=temp1->
temp2=temp2->
if(!
temp1
flag=true;
compare2(Long_Numtemp//升级版比较,可比较长度的大整数,大于等于返回true
if(len>
temp.len
returntrue;
if(len==temp.len
returncompare(temp;
returnfalse;
•boolcompare(Long_Numtemp都是实现两个大整数的比较。
set_Long_Num(strings//将输入的字符串转成大整数
intstr_len=s.length(;
head=newnode((ints[0]-48;
len++;
if(str_len>
1
for(inti=1;
i
node*Newnode=newnode((ints[i]-48;
length(;
set_Long_Num2(inttemp//建立大整数,将参数建立新节点加在尾部
node*Newnode=newnode(temp;
if(back
head=Newnode;
•voidset_Long_Num(strings创建大整数,把字符串的内容转为int赋给大整数。
•voidset_Long_Num2(inttemp如果当前大整数为空,则创建大整数,并把值赋给它,如果非空,则在后面添加节点,把值赋给节点。
Long_NumLong_Num:
sub_Num(Long_Numtemp,node*&
p//截取一定长度,用于试商法
Long_Numtempp;
strings="
;
while(p2
s+=p1->
value+'
0'
tempp.set_Long_Num(s;
pare(temp//如果截取的子串还是比参数小,再向后截一位
tempp.set_Long_Num2(p1->
tempp.length(;
returntempp;
}
•Long_Numsub_Num(Long_Numtemp,node*&
p截取被除数的字串,用于除法与除数的比较,如果小,则再截取后面一位。
intLong_Num:
result(Long_Numtemp//除法中的试商法得到当前位的商
intresult=0;
while(compare2(temp
decrease(temp;
result++;
returnresult;
•intresult(Long_Numtemp得到当前大整数除以除数的商。
实现思路:
加法通过两个操作数的每一位相加,满10进位的思路设计。
代码实现:
add(Long_Numtemp//大整数加法
if(temp.head==NULL||head==NULL
数据为空!
考虑数据的特殊情况
node*temp1,*temp2;
inti=0,j;
temp1=back;
temp2=temp.back;
//如果当前大整数大于后一个,则temp1为长的最后一个节点
for(;
while(temp2!
=NULL
j=temp1->
value+temp2->
value+i;
temp1->
value=j%10;
if(j>
=10
i=1;
i=0;
pre;
}//在短的那个数还没有遍历完的情况下,实现每一位的加法,设置一个i变量,默认设为0。
如果满10则设为1,并在前一位加上,否则设为0。
if(temp1==NULL
if(i==1
node*Newnode=newnode(1;
next=head;
pre=Newnode;
//如果到了长的那个数的头一位,而i仍为1,则在大整数的前面添加值1的节点。
if(temp1!
//如果还没到长的那个数的头一个,执行i与当前数的加法,如果满10则i为1,否则i为0。
return*this;
//把第一个不为0的数的前面的0去掉,并更正大整数的长度,并返回长的那个对象。
while(temp1->
pre!
value=j;
//两个大整数位数相同,每一位都相加,满10进1。
//到了头一位时,如果i为1,则在大整数前面添加值为1的节点。
if(len
temp1=temp.back;
temp2=back;
next=temp.head;
temp.head->
temp.head=temp.head->
equal(temp;
减法通过两个操作数每一位相减,不够则借位的思路设计。
decrease(Long_Numtemp//大整数减法
if(head==NULL||temp.head==NULL
value-temp2->
value-i;
if(j<
value=j+10;
}//在短的那个数还没有遍历完的情况下,实现每一位的减法,设置一个i变量,默认设为0。
如果不够则设为1,并在前一位减去,否则设为0。
//如果还没到长的那个数的头一个,执行i与当前数的减法,如果不够则i为1,否则i为0。
if(compare(temp
if(equalto(temp
set_Long_Num("
0"
}//两个大整数相等则直接返回0
//两个大整数位数相同,每一位都相减,不够则把i=1,在前面一位减的时候减去,再把i=0,否则就i=0。
tempp.equal(temp;
temp1=tempp.back;
equal(tempp;
}//在短的那个数还没有遍历完的情况下,实现每一位的减法,但是用长的那个减去短的那个,设置一个i变量,默认设为0。
//如果还没到长的那个数的头一个,执行i与当前数的减法,用长的那个数减短的,如果不够则i为1,否则i为0。
实验思路:
乘法通过一个操作数的每一位分别于另一个操作数的每一位相乘,得到的结果再相加设计。
change(//删除头尾节点(乘法专用)
node*p1=head->
node*p2=head;
while(p1->
next!
p2->
value=p1->
node*p=back;
p->
pre->
back=p->
p=back;
//删除乘法一开始创建的头尾两个节点,并重新定义头尾节点。
Long_Nummultiply(Long_Numtempp,Long_Numtemps//大整数乘法
Long_Numsum,ex,cx;
ex.head=newnode(0;
ex.len++;
ex.back=ex.head;
sum.head=newnode(0;
sum.len++;
sum.back=sum.head;
cx.head=newnode(0;
cx.len++;
cx.back=cx.head;
node*temp1,*temp2,*tempt;
temp2=temps.back;
for(intw=0;
temp2!
=NULL;
w++//设置w变量,从0循环到第二个大整数的长度。
Long_Numl;
l.head=newnode(0;
l.back=newnode(0;
l.head->
next=l.back;
l.back->
pre=l.head;
tempt=l.back;
//先创建一个大整数l,头尾结点分别为0。
while(temp1!
value*temp2->
i=j/10;
node*Newnode=new
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 大型 实验 整数 运算 系统 源代码 图文