📄 大数相加-ii.cpp
字号:
#include<iostream>
using namespace std;
struct DCLinkNode //双向链表的结点
{
int data;
DCLinkNode *right,*left;
};
class DCLinkList //双向链表
{
public:
DCLinkNode*tail,*currptr;
DCLinkList()
{
tail=currptr=new DCLinkNode;
tail->left=tail->right=tail;
tail->data=1;
}
void InsterTail(int x); //尾插入
void InsterHead(int x); //头插入
void DelNode(DCLinkNode*temp); //删除结点
};
//尾插入
void DCLinkList::InsterTail(int x)
{
currptr=new DCLinkNode;
currptr->data=x;
currptr->left=tail;
currptr->right=tail->right;
tail->right->left=currptr;
tail->right=currptr;
tail=currptr;
}
//头插入
void DCLinkList::InsterHead(int x)
{
currptr=new DCLinkNode;
currptr->data=x;
currptr->left=tail->right;
currptr->right=tail->right->right;
tail->right->right->left=currptr;
tail->right->right=currptr;
if(tail->right==currptr)
tail=currptr;
}
//删除结点
void DCLinkList::DelNode(DCLinkNode*temp)
{
temp->left->right=temp->right;
temp->right->left=temp->left;
temp->left=temp->right=temp;
delete temp;
}
//输入大数
void InputNum(DCLinkList &X)
{
char ch=0;
X.InsterTail(0);
cin>>ch;
while(ch!=';')
{
if(ch=='-')
{
X.tail->right->data=-1;
}
if(ch==',')
{
X.InsterTail(0);
}
if(ch>='0'&&ch<='9')
{
X.currptr->data=X.currptr->data*10+(int(ch)-48);
}
cin>>ch;
}
// cout<<endl;
}
//大数取反
void Neg_Num(DCLinkList &X)
{
for(X.currptr=X.tail->right->right;X.currptr!=X.tail->right;X.currptr=X.currptr->right)
X.currptr->data=0-X.currptr->data;
}
//主函数
int main()
{
DCLinkList A,B,C;
cout<<"输入第一个数A:";
InputNum(A);
if(A.tail->right->data==-1)
Neg_Num(A);
cout<<"输入第二个数B:";
InputNum(B);
if(B.tail->right->data==-1)
Neg_Num(B);
//以下是大数相加的过程
A.currptr=A.tail;
B.currptr=B.tail;
while((A.currptr!=A.tail->right)&&(B.currptr!=B.tail->right))
{
C.InsterHead((A.currptr->data)+(B.currptr->data));
A.currptr=A.currptr->left;
B.currptr=B.currptr->left;
}
if(B.currptr!=B.tail->right) //B长于A的时候
{
while(B.currptr!=B.tail->right)
{
C.InsterHead(B.currptr->data);
B.currptr=B.currptr->left;
}
}
else if(A.currptr!=A.tail->right) //A长于B的时候
{
while(A.currptr!=A.tail->right)
{
C.InsterHead(A.currptr->data);
A.currptr=A.currptr->left;
}
}
DCLinkNode *temp;
C.currptr=C.tail->right->right;
while(C.currptr->data==0) //削去顶头的‘零’
{
temp=C.currptr;
C.currptr=C.currptr->right;
C.DelNode(temp);
}
//以下是数字的按位整理
if(C.tail->right->right->data<0)
{
C.tail->right->data=-1;
Neg_Num(C);
}
for(C.currptr=C.tail;C.currptr!=C.tail->right->right;C.currptr=C.currptr->left)
{
if(C.currptr->data>=10000)
{
C.currptr->data=C.currptr->data-10000;
C.currptr->left->data++;
}
if(C.currptr->data<0)
{
C.currptr->left->data--;
C.currptr->data=10000+C.currptr->data;
}
}
//输出结果C
cout<<"计算的结果是:";
if(C.tail->right->data==-1)cout<<"-";
for(C.currptr=C.tail->right->right;C.currptr!=C.tail->right;C.currptr=C.currptr->right)
{
if(C.currptr->data<10)
cout<<"000"<<C.currptr->data<<",";
else
if(C.currptr->data<100)
cout<<"00"<<C.currptr->data<<",";
else
if(C.currptr->data<1000)
cout<<"0"<<C.currptr->data<<",";
else cout<<C.currptr->data<<",";
}
cout<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -