输入
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
输出
输出A + B
输入样例
68932147586 468711654886
输出样例
537643802472
此题需要细心。划分为0+0 、两个正数或者两个负数相加、一正一负相加3种情况。
用到了比较多的字符串处理
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
string a,b;
int lena,lenb;
void zadd(){
int da=max(lena,lenb);
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
//高位添零;
if(lena<lenb){
for(int i=0;i<lenb-lena;++i)
a+='0';
}
else for(int i=0;i<lena-lenb;++i)b+='0';
a+='0',b+='0';
/*
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
*/
//加法
string ans=a;
int jin=0;
for(int i=0;i<da+1;++i)
{
int temp=(a[i]-'0')+(b[i]-'0')+jin;
jin=temp/10;
ans[i]=(char)(temp%10+'0');
}
reverse(ans.begin(),ans.end());
int i=0;
while(ans[i]=='0')
i++;
for(int j=i;j<ans.length();++j)
cout<<ans[j];
}
bool compare(string ta,string tb){
if(ta.length()>tb.length()){
cout<<"-";
return true;
}
else if(ta.length()<tb.length()){
// cout<<"+";
return false;
}
else {
for(int i=0;i<ta.length();++i){
if(ta[i]>tb[i]){
cout<<"-"; return true;
}
else return false;
}
}
}
void doJian(string da,string xiao){
// cout<<"初始:da:"<<da<<"xiao"<<xiao<<endl;
//使得高位在后面
string ans=da;
reverse(da.begin(),da.end());
reverse(xiao.begin(),xiao.end());
//小的数在后面添0
int tt= da.length()-xiao.length();
for(int i=0;i<tt;++i)
xiao+='0';
// cout<<"da:"<<da<<"xiao"<<xiao<<endl;
int jin=0;
for(int i=0;i<da.length();++i){
int temp=(da[i]-'0')-(xiao[i]-'0')+jin;
if(temp<0) {
jin=-1;
temp+=10;
}
else jin=0;
ans[i]=temp+'0';
}
reverse(ans.begin(),ans.end());
int i=0;
while(ans[i]=='0')
i++;
for(int j=i;j<ans.length();++j)
cout<<ans[j];
//输出结果
}
void jian(){
//找大的减数;
if(a[0]=='-'&&b[0]!='-'){
string ta,tb;
ta=a.substr(1,a.length()-1);
// cout<<"ta的值:"<<ta<<endl;
tb=b;
bool flag= compare(ta,tb);//a的绝对值大于b吗
if(flag) doJian(ta,tb);
else doJian(tb,ta);
}
else if(a[0]!='-'&&b[0]=='-'){
string ta,tb;
tb=b.substr(1,b.length()-1);
//cout<<"tb的值:"<<tb<<endl;
ta=a;
bool flag= compare(tb,ta);//b的绝对值大于a吗
if(flag) doJian(tb,ta);
else doJian(ta,tb);
}
}
int main(){
cin>>a>>b;
lena=a.length();
lenb=b.length();
if(a[0]!='-'&&b[0]!='-'){//都是正数;
if(a=="0"&&b=="0") cout<<"0";
else zadd();
}
else if(a[0]=='-'&&b[0]=='-'){
a[0]='0';
b[0]='0';
cout<<"-";
zadd();
}
else {
//a为负数
string a1=a.substr(1,a.length()-1);
string b1=b.substr(1,b.length()-1);
if((a1==b&&a[0]=='-')||(b1==a&&b[0]=='-'))
cout<<"0";
else jian();
}
}