问题描述
- 怎么修改下面的代码,关于两数求和
-
#include<iostream> #include<string> #include<math.h> using namespace std; struct LinkNode { int data; //记录每个节点的整数(小于10000) LinkNode *next; //记录下一个节点的地址 LinkNode *prev; //记录前一个节点的地址 }; class LinkList { private: LinkNode *head0,*head1; //head0,head1分别记录两个整数链表的头指针 LinkNode *currptr; LinkNode *result; //result记录结果链表的头指针 public: LinkList(); //构造函数,初始化链表 ~LinkList(); //析构函数,释放空间 void Creat(string a); //引入字符串,创立两个链表,分别表示两个整数 void Add(); //实现两个整数相加 void Display(); //显示结果 void addtwo(); //节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的 }; int sum(int n); LinkList::LinkList() //构造函数,初始化链表 { head0=new LinkNode; //申请一个空间记录整数的符号和节点数 head1=new LinkNode; head0->next=head0; head0->prev=head0; //初始化链表,建立双向循环链表 head1->next=head1; head1->prev=head1; result=new LinkNode; result->next=result; result->prev=result; currptr=NULL; } LinkList::~LinkList() //析构函数,释放空间 { LinkNode *p1=head0,*p2=head1,*p3=result; //三个指针分别指向三条链表的头指针 while(p1!=p1->prev) { p1->prev->next=p1->next; p1->next->prev=p1->prev; currptr=p1; p1=p1->next; delete currptr; } while(p2!=p2->prev) //逐个删除节点,释放空间 { p2->prev->next=p2->next; p2->next->prev=p2->prev; currptr=p2; p2=p2->next; delete currptr; } while(p3!=p3->prev) { p3->prev->next=p3->next; p3->next->prev=p3->prev; currptr=p3; p3=p3->next; delete currptr; } // 删除 p1,p2,p3; } void LinkList::Creat(string a) //引入字符串,创立两个链表,分别表示两个整数 { int i=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0; //i记录字符串,j记录加数节点数;s记录被加数节点数,w标记字符串中的'-'号, //k记录字符串中的字符转化为整数的值,l使每个节点记录4位 while(a[m]!=';') m++; //m记录字符串中被加数的字符数 n=m; while(a[n]!='') n++; //n记录字符串的总字符数 if(a[0]=='-') { head0->data=(-1); //记录整数符号 w=1; } else {head0->data=1;} for(i=m-1;i>=w;i--) { if(a[i]!=',') //把字符转化为整数 { k+=(a[i]-'0')*sum(l); l++; } if(a[i]==','||i==w) { currptr=new LinkNode; //把整数存到双向循环链表中 currptr->data=k; currptr->next=head0; currptr->prev=head0->prev; head0->prev->next=currptr; head0->prev=currptr; head0=currptr; s++; //节点数加1 k=0; //重新初始化k和l l=0; } } head0->prev->data*=s; //存储整数符号和节点数 //与建第一个整数链表一样,建立第二个整数链表head1 k=0;l=0; if(a[m+1]=='-') { head1->data=(-1); m++; } else head1->data=1; for(i=n-1;i>m;i--) { if(a[i]!=',') { k+=(a[i]-'0')*sum(l); l++; } if(a[i]==','||i==m+1) { currptr=new LinkNode; currptr->data=k; currptr->next=head1; currptr->prev=head1->prev; head1->prev->next=currptr; head1->prev=currptr; head1=currptr; j++; k=0; l=0; } } head1->prev->data*=j; } void LinkList::Add() //实现两个整数相加 { LinkNode *temp; if(abs(head0->prev->data)>abs(head1->prev->data)) //两个整数中,绝对值大的为被加数 addtwo(); else if(abs(head0->prev->data)<abs(head1->prev->data)) { temp=head0; head0=head1; head1=temp; addtwo(); } else if(abs(head0->prev->data)==abs(head1->prev->data)) { int k1,k2; LinkNode *p=head0,*q=head1; //如果节点数相同,则判断节点中数值大小 while(p->data==q->data&&p!=head0->prev->prev&&q!=head1->prev->prev) { p=p->next; q=q->next; } k1=p->data; k2=q->data; if(k1>k2) addtwo(); else { temp=head0; head0=head1; head1=temp; addtwo(); } } } void LinkList::addtwo() //节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的 //默认head0存的整数绝对值比head1大 { int s=0,m1=head0->data,m2=head1->data; m1=(head0->prev->data/abs(head0->prev->data)); //head0的符号 m2=(head1->prev->data/abs(head1->prev->data)); //head1的符号 LinkNode *p=head0->prev->prev,*q=head1->prev->prev; result->data=head0->prev->data; //存结果的节点数和符号 while(q!=head1->prev) //head0存的整数绝对值比head1大,即head0的节点数大于或等于head1 { currptr=new LinkNode; currptr->data=(p->data)*m1+(q->data)*m2+s; //两整数相加 if((m1*m2)>0) //如果符号相同 { if(abs(currptr->data)-10000>=0) //相加后超过10000,则进位 { s=currptr->data/10000; currptr->data=abs(currptr->data)%10000; } else //abs(currptr->data)-10000<0,不进位 { s=0; currptr->data=abs(currptr->data); } } else if(m1>0&&m2<0) //符号不同,在此相当于实现两个正整数相减 { s=0; if(currptr->data<0) //小于0,向前一位借1 { currptr->data+=10000; s=-1; } } else if(m1<0&&m2>0) //符号不同,在此相当于实现负整数加上正整数 { s=0; if(currptr->data>0) //大于0, { currptr->data=10000-currptr->data; s=1; } else currptr->data=abs(currptr->data); } currptr->next=result; //存入链表 currptr->prev=result->prev; result->prev->next=currptr; result->prev=currptr; result=currptr; p=p->prev; q=q->prev; } //当head0节点数比head1长时,继续建立链表 while(p!=head0->prev) { currptr=new LinkNode; currptr->data=p->data*m1+s; s=currptr->data/10000; if((m1*m2)>0) { if(abs(currptr->data)-10000>=0) { s=currptr->data/10000; currptr->data=abs(currptr->data)%10000; } else {s=0;currptr->data=abs(currptr->data);} } else if(m1>0&&m2<0) { s=0; if(currptr->data<0) { currptr->data+=10000; s=-1; } } else if(m1<0&&m2>0) { s=0; if(currptr->data>0) { currptr->data=10000-currptr->data; s=1; } else currptr->data=abs(currptr->data); } currptr->data=abs(currptr->data)%10000; currptr->next=result; currptr->prev=result->prev; result->prev->next=currptr; result->prev=currptr; result=currptr; p=p->prev; } if(s!=0) //处理相加后,进位问题 { currptr=new LinkNode; currptr->data=abs(s); currptr->next=result; currptr->prev=result->prev; result->prev->next=currptr; result->prev=currptr; result=currptr; result->prev->data=m1*(abs(result->prev->data)+1); } } void LinkList::Display() //显示结果 { LinkNode *p=result; int FuHao=result->prev->data/abs(result->prev->data);//结果的符号 while(p->data==0&&p!=result->prev->prev) //当运算后前几个节点的数据为0时,不输出 { p=p->next; result->prev->data=(abs(result->prev->data)-1)*FuHao; //结果记录非0节点数 } cout<<FuHao*p->data; //首先显示符号和第一个节点中的数 if(abs(result->prev->data)!=1) p=p->next; //判断非0节点数是否为1 while(p!=result->prev->prev) //继续输出 { cout<<","; //每4位一组,并用','隔开 cout.width(4); cout.fill('0'); cout<<p->data; p=p->next; } if(p==result->prev->prev&&abs(result->prev->data)!=1) //显示最后一个节点数据 { cout<<","; cout.width(4); cout.fill('0'); cout<<p->data; } cout<<endl; } int sum(int n) //计算10的乘方 { int i,s=1; for(i=1;i<=n;i++) { s=s*10; } return s; } int main() //主函数 { cout<<"* 任意长整数的加法 *nn"; cout<<"* 注意:输入时每四位用逗号隔开 *nn"; cout<<"* 如:123456789 *nn"; cout<<"* 输入格式为:1,2345,6789 *nn"; cout<<"* 两个数之间用';'隔开 *nn"; cout<<"n"; string ch; cout<<"请输入整数1;整数2:n"; cin>>ch; //输入任意长字符串 LinkList List; //定义链表对象 List.Creat(ch); //把字符串转化为整数,并存到链表中 List.Add(); //实现两个整数相加 cout<<"两整数的和为:"; List.Display(); //输出结果 }
这个代码里输入两个数的时候要用“;”隔开,这个地方怎么改成让它分别输入两个数然后相加,我改成下面这种但前面格式好像不对,不知道怎么改
string ch1,ch2;
cout<<"请输入整数1:n";cin>>ch1;
cout<<"请输入整数2:n";cin>>ch2;
LinkList List;
List.Creat(ch1,ch2);
List.Add();
cout<<"两整数的和为:";
List.Display();
}
解决方案
string ch1,ch2,ch3;
cout<<"请输入整数1:n";
cin>>ch1;
cout<<"请输入整数2:n";
cin>>ch2;
ch1=ch1+";"+ch2;
LinkList List;
List.Creat(ch1);
List.Add();
cout<<"两整数的和为:";
List.Display();
时间: 2025-01-16 07:46:46