#include<iostream> #include<string> using namespace std; bool isValid(string s) { if(s.size()==0) return false; for(int i=0;i<s.size();i++) { if(s[i]>'9' || s[i]<'0') return false; } return true; } string formatStr(string s) { if(!isValid(s)) return "0"; int i=0; for(;i<s.size();i++) { if(s[i]!='0') { break; } } if(s.size()==i) return "0"; else return s.substr(i,s.size()-i); } class BigPositiveNum { private: string val; public: BigPositiveNum(){ val="0";} BigPositiveNum(string s) { val=formatStr(s); } BigPositiveNum add(string s) { if(!isValid(s)) return *this; string s1=val.size()>s.size()?val:s;//longer one string s2=val.size()>s.size()?s:val;//shorter one string res; int p1=s1.size()-1; int p2=s2.size()-1; int takeover=0;//進位 for(;p2>=0;p2--,p1--) { int n1=s1[p1]-'0'; int n2=s2[p2]-'0'; int sum=n1+n2+takeover; if(sum<10) { takeover=0; res=(char)('0'+sum)+res; }else { takeover=1; sum=sum%10; res=(char)('0'+sum)+res; } } while(takeover&& (p1>=0)) { int sum=s1[p1]-'0'+takeover; p1--; if(sum<10) { takeover=0; res=(char)('0'+sum)+res; }else { takeover=1; sum%=10; res=(char)('0'+sum)+res; } } //string substr(int pos = 0,int n = npos) const;//返回pos開始的n個字符組成的字符串 if(takeover) res='1'+s1.substr(0,p1+1)+res; else res=s1.substr(0,p1+1)+res; return BigPositiveNum(res); } BigPositiveNum subtrt(string s) { if(!isValid(s)) return *this; s=formatStr(s); if(val==s) return BigPositiveNum(); string s1,s2; bool isNeg=false; if(val.size()<s.size() || val<s) { isNeg=true; cout<<"計算結果爲負數,咱們將計算差的絕對值"<<endl; s1=s;//bigger one s2=val; }else { s1=val; s2=s; } string res; int p1=s1.size()-1; int p2=s2.size()-1; int borrow=0;//借位 for(;p2>=0;p2--,p1--) { int n1=s1[p1]-'0'; int n2=s2[p2]-'0'; if(borrow) { n1--; if(n1>=n2) { borrow=0; res=(char)('0'+n1-n2)+res; }else { borrow=1; res=(char)('0'+n1+10-n2)+res; } }else { if(n1>=n2) { borrow=0; res=(char)('0'+n1-n2)+res; }else { borrow=1; res=(char)('0'+n1+10-n2)+res; } } } while(borrow&&(p1>=0)) { int n1=s1[p1]-'0'-1; p1--; if(n1>=0) { borrow=0; res=(char)('0'+n1)+res; }else { res='9'+res; } } if(p1>=0) res=s1.substr(0,p1+1)+res; return BigPositiveNum(res); } void show() { cout<<formatStr(val)<<endl; } }; int main() { cout<<"a add b"<<endl; BigPositiveNum x("9999999999999999999999999999999999999999999999999999"); (x.add("1")).show(); cout<<"a subtract b"<<endl; BigPositiveNum a("2000000000000000000000000000000000000000000000000"); (a.subtrt("2")).show(); return 0; } /*output a add b 10000000000000000000000000000000000000000000000000000 a subtract b 1999999999999999999999999999999999999999999999998 */