大数加减法,使用string类型来表示数字
//思路:
1):对于两个正数或者是负数相加,则直接相加
2):负数加上正数,则相当于正数减去负数
代码如下:
/** 大整数的加减法 */ #include <iostream> #include <string> using namespace std; int myminus=0;//0 表示没有负号,1表示有 string bignumdel(string str1,string str2); string bignumAdd(string str1,string str2) { int len1=str1.length(); int len2=str2.length(); if(len1==0) return str2; if(len2==0) return str1; if(str1[0]=='-' && str2[0]=='-') { myminus=1; str1.erase(0,1);str2.erase(0,1); return bignumAdd(str1,str2); } else if(str1[0]=='-' && str2[0]!='-') { str1.erase(0,1); return bignumdel(str2,str1); } else if(str1[0]!='-' && str2[0]=='-') { str2.erase(0,1); return bignumdel(str1,str2); } //add int maxlen=len1; string result; if(len1>len2) { maxlen=len1; for(int i=0;i<(len1-len2);i++) { str2='0'+str2; } } else if(len2>len1) { maxlen=len2; for(int i=0;i<(len2-len1);i++) { str1='0'+str1; } } int takeover=0; for(int i=maxlen-1;i>=0;i--) { int tmp=(str1[i]-'0')+(str2[i]-'0')+takeover; takeover=0; if(tmp>=10) { tmp=tmp%10; takeover=1; } char ch=('0'+tmp); result= ch +result; } if(takeover==1) result='1'+result; return result; } string bignumdel(string str1,string str2) { int len1=str1.length(); int len2=str2.length(); if(len1>len2) { for(int i=0;i<len1-len2;i++) str2='0'+str2; } else if(len2>len1) { for(int i=0;i<len2-len1;i++) str1='0'+str1; myminus=1; return bignumdel(str2,str1); } else if(len1==len2) { if(str1<str2) { myminus=1; return bignumdel(str2,str1); } } //del int takeover=0; string result; for(int i=len1-1;i>=0;i--) { int tmp=(str1[i]-'0')-(str2[i]-'0')-takeover; if(tmp<0) { tmp=(str1[i]-'0')-(str2[i]-'0')+10-takeover; takeover=1; } char ch='0'+tmp; result= ch +result; } return result; } int main() { string str1,str2; while(cin>>str1>>str2) { string res=bignumAdd(str1,str2); if(myminus==1) printf("-"); int len=res.length(); int i=0; while((i++)<len)//除0前缀 { if(res[0]=='0') { res.erase(0,1); } else break; } cout<<res<<endl; myminus=0; } return 0; }