当前位置: 代码迷 >> 综合 >> 1005 大数加法 51nod题解
  详细解决方案

1005 大数加法 51nod题解

热度:56   发布时间:2023-11-14 23:42:00.0

输入

第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());//小的数在后面添0int 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();} 
}