您的位置:首页 > 编程语言 > C语言/C++

C++大数(正整数)相加相减v1

2016-08-06 21:07 471 查看
#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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: