使用字符串完成大数的加减运算
2020-02-23 本文已影响0人
零岁的我
这里的大数指的是远超long long int的数。
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
#define base 10
//去掉正数前面的0
string deZero(string s)
{
long int i;
for(i=0;i<s.length();++i){
if(s.at(i)>48){
break;
}
}
if(i==s.length())
return "0";
s.erase(0,i);
return s;
}
//使用string完成大数加法
string bigNumAdd(string str1,string str2)
{
int tmp;
string strSum;
str1=deZero(str1);
str2=deZero(str2);
long int len1=str1.size();//size()函数返回的是字符串去掉结尾标志"\0"后的长度
long int len2=str2.size();
int bit=0;
while(len1 && len2){
tmp=str1[len1-1]-'0'+str2[len2-1]-'0'+bit; //str1[len1-1]-'0'由字符数字转数字
bit=tmp/10;
tmp%=10;
strSum+=tmp+'0';
--len1;
--len2;
}
while(len1){
tmp=str1[len1-1]-'0'+bit;
bit=tmp/base;
tmp%=base;
strSum+=tmp+'0';
--len1;
}
while(len2){
tmp=str2[len2-1]-'0'+bit;
bit=tmp/10;
tmp%=10;
strSum+=tmp+'0';
--len2;
}
if(bit){
strSum+=bit+'0';
}
reverse(strSum.begin(),strSum.end());
return strSum;
}
//判断两个正数的大小
int judge(string str1,string str2)
{
if(str1.length()>str2.length())
return 1;
if(str1.length()<str2.length())
return -1;
long int i;
for(i=0;i<str1.length();++i){
if(str1.at(i)>str2.at(i))
return 1;
if(str1.at(i)<str2.at(i)){
return -1;
}
}
return 0;
}
//使用string完成大数减法
string substract(string str1,string str2)
{
str1=deZero(str1);
str2=deZero(str2);
int i=judge(str1,str2);
string d="-";
int j=0;
if(i==0)
return "0";
if(i==-1){
string tmp=str1;
str1=str2;
str2=tmp;
j=-1;
}
long int len1=str1.length();
long int len2=str2.length();
int temp;
int bit=0;
string strResult;
cout<<str1<<str2<<endl;
while(len1 && len2){
str1[len1-1]-=bit;
if(str1.at(len1-1)<str2.at(len2-1)){
bit=1;
}
else{
bit=0;
}
temp=bit*base+(str1[len1-1]-'0')-(str2[len2-1]-'0');
strResult+=temp+'0';
--len1;
--len2;
}
while(len1){
str1[len1-1]-=bit;
if(str1.at(len1-1)<48){
bit=1;
}
else{
bit=0;
}
temp=bit*base+str1[len1-1]-'0';
strResult+=temp+'0';
--len1;
}
reverse(strResult.begin(),strResult.end());
strResult=deZero(strResult);
if(j==-1)
strResult.insert(0,d);
return strResult;
}
int main(int argc,char **argv)
{
string str1="13217457591712738252762127461276498466551651";
string str2="464646132157216765212427137317175217517415";
string str=bigNumAdd(str1,str2);
cout<<str1<<"+"<<str2<<"="<<str<<endl;
string str3="0123";
string str4="4560";
string str5=substract(str3,str4);
cout<<str3<<"-"<<str4<<"="<<str5<<endl;
return 0;
}