用链表实现大数相加减文档格式.docx
《用链表实现大数相加减文档格式.docx》由会员分享,可在线阅读,更多相关《用链表实现大数相加减文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
建立链表(将输入的两个数中较大的保存在fir表头的链表中):
voidcreatlist(){
boolfalg=false;
//标记输入的两个整数是否需要进行互换;
if()-falg1>
()-falg2)//falg1表示输入的第一个整数前面的符号;
falg=true;
if()-falg2==()-falg1){
for(inti=0;
i<
()-falg2;
i++){
if(opration=='
+'
){//如果是实现加法,不用管建链表时的整数互换
falg=true;
break;
}
if(arr1[i+falg1]>
arr2[i+falg2]){
if(i==()-falg1-1)falg=false;
}
}
if(falg)
{
for(inti=()-1;
i>
=falg1;
i--){
node*s;
s=newnode;
s->
num=arr1[i]-'
0'
;
//从输入的整数尾部逆向建立链表
if(fir==NULL)fir=s;
elseefir->
next=s;
efir=s;
efir->
next=NULL;
//尾结点的next一定要赋NULL,不然会出现错误
=falg2;
num=arr2[i]-'
if(sec==NULL)sec=s;
elseesec->
esec=s;
esec->
else{
if(opration=='
)return;
if(!
falg)f=!
f;
//f表示整个运算结果的正负
}
voidadd(){//实现加法
//标记是否进位
intnum2=sec->
num;
for(node*head1=fir,*head2=sec;
head1;
head1=head1->
next){//因为以fir为表头建立的链表所保存的整数较大,所以,以sec为表头建立的链表会先或者同时遍历到表位
intnum1=head1->
head1->
num=(falg+num1+num2)%10;
falg=(falg+num1+num2)/10;
if(head2->
next){//判断以sec为表头的链表是否达到表尾
head2=head2->
next;
num2=head2->
elsenum2=0;
if(f)cout<
<
"
-"
if(falg)cout<
1;
inti=0;
char*ans=newchar[sizeof(arr1)+sizeof(arr2)];
for(node*head1=fir;
next){
ans[i]=head1->
num+'
i++;
for(i--;
=0;
i--)
cout<
ans[i];
voidsub(){//实现两整数相减
//判是否退位
num=num1-num2-falg;
if(num1-falg-num2<
0){
falg=true;
head1->
num=head1->
num+10;
elsefalg=false;
i--;
falg=false;
for(intj=0;
j<
=i;
j++){
if(ans[j]!
='
)break;
if(j==i){
cout<
0;
return;
if(ans[i]=='
)i--;
for(;
voiddele(){//回收内存
node*tem;
fir;
){
tem=fir;
fir=fir->
deletetem;
sec;
tem=sec;
sec=sec->
tem=fir=efir=sec=esec=NULL;
程序流程图
三、程序测试
1、设计测试用例
0+0
1+1
10+1
1+10
000000000+
-1+1
1+-1
-10+100
100+-10
-1000000+-0000000000000000000000000000000
10-10
1-10
10-1
1-7
7-1
5-5
-10--10
-11--1
-1--15515
-1--8
-8--1
-66--6
2、程序测试结果
0+0=0
1+1=2
10+1=11
1+10=11
000000000+=
-1+1=0
1+-1=0
-10+100=90
100+-10=90
-1000000+-0000000000000000000000000000000=-0000000000000000000000001000000
10-10=0
1-10=-9
10-1=9
1-7=-6
7-1=6
5-5=
000000000000000000000000000000000
-10--10=0
-11--1=-10
-1--15515=15514
-1--8=7
-8--1=-7
-66--6=-000000000000000000
四、使用说明
能正确实现两个大整数(包括正负)相加减的运算
五、收获体会及建议
完整代码:
#include<
cstdio>
string>
cstring>
iostream>
usingnamespacestd;
boolf,falg1,falg2;
stringarr1,arr2;
charopration;
node*fir=NULL,*efir=NULL,*sec=NULL,*esec=NULL;
()-falg2)
){
voidadd(){
next){
voidsub(){
intmain(){
cout<
输入算式,形如:
endl;
a+bora-b"
while(cin>
>
arr1>
opration>
arr2){
chartem=opration;
f=false,falg1=false,falg2=false;
if(arr1[0]=='
-'
)falg1=true;
if(arr2[0]=='
)falg2=true;
if(opration=='
falg2){
opration='
if(falg1){
f=true;
opration='
if(falg1)
if(!
(opration=='
falg2)){
if(opration=='
!
falg2)opration='
elseopration='
falg1&
opration=='
tem=='
creatlist();
)
add();
elsesub();
dele();
return0;