思路:
1.用字符串来存储大数;
2.判断两个数的正负性;
3.按位相加存储在数组中,然后判断和的正负性;
4.根据和的正负分别对每位进行处理;
5.记得处理和为0的情况;
代码:
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
vector<int> v;
int main(){
int t,kase=0;
cin>>t;
while(t--){
cout<<"Case "<<(++kase)<<":
";
string a,b; //数字过大超出int范围
cin>>a>>b;
cout<<a<<" + "<<b<<" = ";
v.clear();
int a_sign=1,b_sign=1,a_len=a.length(),b_len=b.length();
if(a[0]=='-'){//判断正负性
a_sign=-1;
a_len--;
}
if(b[0]=='-'){
b_sign=-1;
b_len--;
}
int max_len=max(a_len,b_len);
v.resize(max_len+1);
for(int i=0;i<max_len;i++){
int x=(i<a_len?a_sign*(a[a.length()-i-1]-'0'):0);
int y=(i<b_len?b_sign*(b[b.length()-i-1]-'0'):0);
v[i]=x+y;
}
int sign=0;//通过最高位的正负性来判断和的正负性
for(int i=max_len;i>=0;i--){
if(v[i]){
sign=v[i]>0?1:-1;
break;
}
}
for(int i=0;i<=max_len&&sign;i++){
if(v[i]>9&&sign>0){
v[i+1]++;
v[i]-=10;
}else if(v[i]>0&&sign<0){
v[i]=10-v[i];
v[i+1]++;
}else if(v[i]<0&&sign>0){
v[i]+=10;
v[i+1]--;
}else if(v[i]<0&&sign<0){
v[i]*=-1;
if(v[i]>9){v[i]-=10;v[i+1]--;}
}
}
if(sign==-1) putchar('-');
int pos=max_len;
while(!v[pos]) pos--;
while(pos>=0) putchar(v[pos--]+'0');
puts(sign?"":"0");//和可能为0
if(t) puts("");
}
return 0;
}