一般像1000+1000这样的可直接存储运算,没毛病吧,但是像1e18范围内的运算,int 和long long 都不能储存的情况的时候
这时候,由于A和B的取值范围远远大于数据类型给定的范围,不能满足较大规模的高精度数值计算,因此需要利用其他方法来实现高精度数值的计算,于是产生了大数运算。大数运算主要有加、减、乘这三种方法,由于代码都是固定的,直接拉宝哥板子haha
1.大数加法
string Add(string a,string b)
{
string c;
int len1=a.length();
int len2=b.length();
int len=max(len1,len2);
for(int i=len1;i<len;i++)
a="0"+a; //在前面加0
for(int i=len2;i<len;i++)
b="0"+b; //在前面加0
int ok = 0; //进位判断
for(int i=len-1;i>=0;i--) //从低位开始,即字符串最后开始
{
char tmp = a[i]+b[i]-'0'+ok;
if(tmp>'9')
{
ok = 1; //存在进位
tmp-=10;
}
else
ok=0;
c=tmp+c; //tmp加到高位去,即前面
}
if(ok)
c="1"+c;
return c;
2.大数减法
string Sub(string a,string b)
{
string c;
bool ok=false; //判断结果为正为负,初始假设为正
int len1=a.length();
int len2=b.length();
int len=max(len1,len2);
for(int i=len1;i<len;i++)
a="0"+a; //前面补0
for(int i=len2;i<len;i++)
b="0"+b; //前面补0
if(a<b) //
{
ok=true; //a<b说明结果为负,将标志变量ok置为true
string temp=a;
a=b;
b=temp; //交换a和b
}
for(int i=len-1;i>=0;i--) //从低位开始相减
{
if(a[i]<b[i]) //a一定是大于等于b的,所以不存在最高位还要借位的情况,数组不越界
{
a[i-1]-=1;
a[i]+=10;
}
char tmp = a[i]-b[i]+'0';
c=tmp+c; //高位加到前面去
}
int pos=0;
while(c[pos]=='0'&&pos<len)
pos++; //去掉前到0
if(pos==len) //说明a-b为0
return "0";
if(ok) //说明结果为负
return "-"+c.substr(pos);
return c.substr(pos); //返回c串的pos开始到结束的子串
}
3.大数乘法
//大数乘法(要用到大数加法)
string add(string a,string b)
{
string s;
int len1,len2;
len1=a.size()-1;
len2=b.size()-1;
int flag=0;
while(len1>-1&&len2>-1)
{
int sum=flag+(a[len1--]-'0')+(b[len2--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
while(len1>-1)
{
int sum=flag+(a[len1--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
while(len2>-1)
{
int sum=flag+(b[len2--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
if(flag)
s+=char('0'+flag);
int len=s.size()-1;
while(len>-1)
{
if(s[len]!='0')
break;
s=s.substr(0,s.size()-1);
len--;
}
for(int i=0;i<s.size()/2;i++)
{
char c=s[i];
s[i]=s[s.size()-i-1];
s[s.size()-i-1]=c;
}
if(s.size()==0)
s+='0';
return s;
}
string mul(string a,string b)//需要用到大数加
{
string s;
int len1=a.size();
int len2=b.size();
for(int i=0;i<len2;++i)
{
int num=b[len2-i-1]-'0';
int len=len1-1;
int flag=0;
string temp="";
while(len>-1)
{
int sum=flag+(a[len--]-'0')*num;
temp+=char ((sum)%10+'0');
flag=sum/10;
}
if(flag)
temp+=char('0'+flag);
len=temp.size();
for(int j=0;j<len/2;j++)
{
char c=temp[j];
temp[j]=temp[len-j-1];
temp[len-j-1]=c;
}
for(int j=0;j<i;++j)
temp+='0';
s=add(s,temp);
}
return s;
}