#include<iostream>
using namespace std;
int temp,len1,len2;
struct node
{ char a; //输入的字符型数据
int c; //实际运算的数据
int x; //权位
node *next; //链接下一个链表的指针
node *pre; //链接上一个链表的指针
bool sign; //符号位
};
void create(node *&head);//生成双向链表
void show(node *head);
bool ab(node *&head,int &len);//求绝对值
void change(node *head);
node *findend(node *&head);//找到链表的最后一个节点
void alignment(node *&heada,node *&headb,int len1,int len2);
int compare(node *heada,node *headb,int len1,int len2);
void addition(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2);
void ca(node *head,node *end);
void sub(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2);
int len(node *head); //计算链表长度
int main()
{ node *a=NULL,*b=NULL,*c=NULL,*d=NULL,*enda=NULL,*endb=NULL,*endc=NULL,*endd=NULL; //定义三个全局变量用以记录两个输入数字的长度(一个数字总共有多少位)
char sign,ctu; //sign记录选择做加法还是减法的符号,ctu记录是否继续运算
bool j1,j2;
int cpr;
cout<<"输入“+”进行高精度加法运算,输入“-”进行高精度减法运算"<<endl;
cin>>sign;
if(sign=='+')
cout<<"请分别输入被加数和加数(以‘z’结尾)"<<endl;
if(sign=='-')
cout<<"请分别输入被减数和减数(以‘z’结尾)"<<endl;
create(a); //输入,转换
len1=temp;
temp=0;
change(a);
create(b);
len2=temp;
temp=0;
change(b);
j1=ab(a,len1); //求绝对值(去掉符号),返回1为正数,0为负数
j2=ab(b,len2);
enda=findend(a);//找尾部
endb=findend(b);
cpr=compare(a,b,len1,len2);//绝对值比较 如果a>b返回1,如果a=b返回0,如果a<b返回-1.
alignment(a,b,len1,len2); //前补对齐
if(sign=='+')
{ if(j1==1)
{ if(j2==1)
{ addition(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
if(j2==0)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
if(cpr==-1)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
cout<<"-";
show(c);
}
}
}
if(j1==0)
{ if(j2==0)
{ addition(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
cout<<"-";
show(c);
}
if(j2==1)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
if(cpr!=0) cout<<"-";
show(c);
}
if(cpr<0)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
show(c);
}
}
}
}
if(sign=='-')
{ if(j1==1)
{ if(j2==1)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
if(cpr<0)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
cout<<"-";
show(c);
}
}
if(j2==0)
{ addition(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
}
if(j1==0)
{ if(j2==0)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
if(cpr!=0) cout<<"-";
show(c);
}
if(cpr<0)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
show(c);
}
}
if(j2==1)
{ addition(enda,endb,a,b,endc,c,len1,len2);
cout<<"-";
ca(c,endc);
show(c);
}
}
}
cout<<"运算结束"<<endl;
}
void create(node *&head)
{ node *s,*p;
s=new node;
p=new node;
cin>>s->a;
while(s->a!='z')
{ if(s->a!=',')
{ if(head==NULL)
{ if(s->a=='-') s->sign=0;
head=s;
s->pre=NULL;
}
else if(head!=NULL){ p->next=s;s->pre=p;}
s->x=temp;
temp++;//权位自加
p=s;//p前移
s=new node;
}
cin>>s->a;
}
p->next=NULL;
delete s;
}
int len(node *head)
{ bool j=0;
int len=0;
while(head)
{ if(head->c==0) //如果前面都是0,指针一直往后移动,直到找到不是数值0的节点,跳出此循环
{ head=head->next;
if(head==NULL) return 1;
}
if(head->c!=0) {j=1;break;}
}
while(head)
{ len++;
head=head->next;
}
return len;
}
void show(node *head)
{ bool j1=0,j2=0;//前面的0不输出
int i=0,clen;
clen=len(head);
if(clen>3&&clen%3==1) i=2;
if(clen>3&&clen%3==2) i=1;
while(head)
{ if(head->sign==0) {head=head->next;continue;}
if(head->c!=0) j2=1;
if(j2==1)
{ cout<<head->c;i++;}
head=head->next;
if(i!=0&&i%3==0&&head!=NULL) cout<<','; // 每三位输出一个逗号
}
if(j2==0&&j1==0) cout<<"0"<<endl; //如果全部都是0 则输出一个0
else cout<<endl;
}
bool ab(node *&head,int &len)//求绝对值(去掉符号),返回1为正数,0为负数
{ node *p=NULL;
if(head->sign==0)
{ p=head;
head=head->next;
len--;
head->pre=NULL;
delete p;
return 0;
}
else return 1;
}
void change(node *head) //ASCII码转换成int型
{ while(head)
{ if(head->a=='-') { head->c=0;head=head->next;continue;} //符号位的数值是0(方便输出)
head->c=head->a-48;
head=head->next;
}
}
node *findend(node *&head)//找到链表的最后一个节点
{ node *p;
p=head;
while(p->next)
{ p=p->next;}
return p;
}
void alignment(node *&heada,node *&headb,int len1,int len2)//对齐前补
{ int i,d;
node *p;
if(len1>len2)
{ d=len1-len2;
p=new node;
for(i=0;i<d;i++)
{ p->c=0;
p->next=headb;
headb->pre=p;
headb=p;
if(i==d-1) {p->pre=NULL;break;}
p=new node;
}
headb=p;
}
if(len2>len1)
{ d=len2-len1;
p=new node;
for(i=0;i<d;i++)
{ p->c=0;
p->next=heada;
heada->pre=p;
heada=p;
if(i==d-1) {p->pre=NULL;break;}
p=new node;
}
heada=p;
}
}
int compare(node *heada,node *headb,int len1,int len2) //绝对值比较 如果a>b返回1,如果a=b返回0,如果a<b返回-1.
{ if(len1>len2) return 1;
if(len1<len2) return -1;
if(len1=len2)
{ while(heada)
{ if(heada->c>headb->c) return 1;
if(heada->c<headb->c) return -1;
if(heada->c==headb->c)
{ heada=heada->next;
headb=headb->next;
if(heada==NULL) return 0;
}
}
}
}
void addition(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2)
{ int maxlen; //建立一个全为0长度为两数字最长者数的链表,记录结果
node *p,*s;
if(len1>len2) maxlen=len1;
else maxlen=len2;
p=new node;
if(maxlen!=1)
for(int i=0;i<maxlen;i++)
{ if(c==NULL) {p->pre=NULL;p->c=0;c=p;continue;}
s=new node;
p->next=s;
s->pre=p;
s->c=0;
if(i==maxlen-1) {s->next=NULL;}
p=s;
}
if(maxlen==1)
{ p=new node;
p->next=NULL;
p->pre=NULL;
p->c=0;
c=p;
}
endc=findend(c);
while(enda) //每个节点相加
{ endc->c=enda->c+endb->c;
enda=enda->pre;
endb=endb->pre;
endc=endc->pre;
}
endc=findend(c);
}
void ca(node *head,node *end) //进位函数
{ int m,n; //M代表留下来的数,N代表需要进的数
while(end->pre)
{ if(end->c>=10)
{ m=end->c%10;
n=end->c/10;
end->pre->c+=n;
end->c=m;
}
if(end->c<0)
{ m=end->c%10;
n=end->c/10-1;
end->pre->c+=n;
end->c=10+m;
}
end=end->pre;
}
}
void sub(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2)
{ int maxlen; //建立一个全为0长度为两数字最长者数的链表,记录结果
node *p,*s;
if(len1>len2) maxlen=len1;
else maxlen=len2;
p=new node;
if(maxlen!=1)
for(int i=0;i<maxlen;i++)
{ if(c==NULL) {p->pre=NULL;p->c=0;c=p;continue;}
s=new node;
p->next=s;
s->pre=p;
s->c=0;
if(i==maxlen-1) {s->next=NULL;}
p=s;
}
if(maxlen==1)
{ p=new node;
p->next=NULL;
p->pre=NULL;
p->c=0;
c=p;
}
endc=findend(c);
while(enda)
{ endc->c=enda->c-endb->c;//实现减法
enda=enda->pre;
endb=endb->pre;
endc=endc->pre;
}
endc=findend(c);
}