#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
*/
转载于:https://my.oschina.net/SnifferApache/blog/728875