您的位置:首页 > 其它

大数加法和大数减法

2015-10-14 00:04 399 查看
两个极大的数相加或相减。主要运用字符串进行计算。

#include<iostream>
#include<string>
using namespace std;
void reverse(string& input){
int n=input.size();
int i=0,j=n-1;
while(i<j){
swap(input[i++],input[j--]);
}
return;
}

string myplus(string a,string b){
int alen=a.size(),blen=b.size();
reverse(a);
reverse(b);
int up=0;
int i=0,j=0;
string res;
while(i<alen&&j<blen){
int aa=a[i]-'0',bb=b[j]-'0';
res.push_back(char((aa+bb+up)%10+'0'));
up=(aa+bb+up)/10;
i++;
j++;
}
while(i<alen){
int aa=a[i]-'0';
res.push_back(char((aa+up)%10+'0'));
up=(aa+up)/10;
i++;
}
while(j<blen){
int bb=b[j]-'0';
res.push_back(char((bb+up)%10+'0'));
up=(bb+up)/10;
j++;
}
if(up) res.push_back(char(up+'0'));
reverse(res);
int ii=0;
while(ii<res.size()&&res[ii]=='0') ii++;

return ii==res.size()?"0":res.substr(ii);
}

string mysub(string a,string b){

string res;

if(a[0]=='-'){
string tmp=b;
b=a;
a=tmp;
}
int alen=a.size(),blen=b.size();
int flag=0;
if(alen<blen-1){
reverse(a);
reverse(b);
string tmp=b;
b=a+"-";
a=tmp.substr(0,tmp.size()-1);
alen=a.size();
blen=b.size();
flag=1;
}else if(alen==blen-1){
int i=0,j=1;
int fflag=0;
while(i<alen&&j<blen){
while(a[i]==b[j]) {i++;j++;}
if(a[i]<b[j]){
fflag=1;
break;
}else{
break;
}
}
if(fflag){
reverse(a);
reverse(b);
string tmp=b;
b=a+"-";
a=tmp.substr(0,tmp.size()-1);
alen=a.size();
blen=b.size();
flag=1;
}else{
reverse(a);
reverse(b);
}

}
else{
reverse(a);
reverse(b);
}
int i=0,j=0;
int borrow=0;
while(i<alen&&b[j]!='-'){
if(borrow==0){
int aa=a[i]-'0',bb=b[j]-'0';
if(aa>=bb){
res.push_back(char(aa-bb+'0'));
}else{
borrow=1;
res.push_back(char(aa+10-bb+'0'));
}
}else{
int aa=a[i]-'0',bb=b[j]-'0';
if(aa-1>= bb){
borrow=0;
res.push_back(char(aa-1-bb+'0'));
}else{
res.push_back(char(aa-1+10-bb+'0'));
}
}
i++;j++;
}
while(i<alen){
if(borrow==0){
res.push_back(a[i]);
}else{
int aa=a[i]-'0';
if(aa-1>=0){
borrow=0;
res.push_back(char(aa-1+'0'));
}else{
res.push_back(char(aa-1+10+'0'));
}
}
i++;
}
if(flag==1){
reverse(res);
int ii=0;
while(ii<res.size()&&res[ii]=='0') ii++;
return ii==res.size()?"0":"-"+res.substr(ii);
}
else{
reverse(res);
int ii=0;
while(ii<res.size()&&res[ii]=='0') ii++;
return ii==res.size()?"0":res.substr(ii);
}
}

int main(){
string input1,input2;
cin>>input1>>input2;
if(input1[0]!='-'&&input2[0]!='-') cout<<myplus(input1,input2);
else if(input1[0]=='-'&&input2[0]=='-') cout<<'-'<<myplus(input1.substr(1),input2.substr(1));
else{
cout<<mysub(input1,input2);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: