当数值很大的时候,两个数的简单运算计算机也是不能处理的,因为整数和浮点数在计算机中都是由范围限制的,所以当数很大的时候可能会溢出。这个时候就需要用字符串来模拟计算了。
加法:
string add(string &a,string &b)
{
string sum;
int s=0,z=0,i=a.size()-1,j=b.size()-1;
while(i>=0||j>=0)
{
s=z;
if(i>=0)s+=(a[i]-'0'); //模拟将对应位相加
if(j>=0)s+=(b[j]-'0');
z=s/10;
sum.push_back(s%10+'0'); //将结果存入sum
i--;j--;
}
if(z)sum.push_back(z+'0'); //如果最后还有进位也需要放入sum
reverse(sum.begin(),sum.end()); //最后要将sum反转
return sum;
}
减法:
//返回a-b,结果为|a-b|或则-|a-b|,所以只要判断a、b的大小然后计算绝对值就可以了
string sub(string &a,string &b)
{
int la=a.size()-1,lb=b.size()-1;
bool big=(la>lb||(la==lb&&a>b)); //判断a是否大于b
string ans;
if(!big) //若a小于b则交换a、b,使a>=b
{
ans=a;
a=b;
b=ans;
}
ans="";
int i=0,j=0,s=0,z=0; //计算a-b
while(i>=0||j>=0)
{
s=z; //低位的借位
s+=(a[i]-'0'); //模拟每位相减
if(j>=0)s-=(b[j]-'0');
if(s<0)
{
s+=10;
z=-1;
}
else z=0;
i--;j--;
ans.push_back(s%10+'0'); //将本位差存入ans
}
if(!big)ans.push_back('-'); //将ans反转
return ans;
}
除法(一个很大的数除一个较小的数):
// 计算n/d,s用来保存商,b用来保存余数
void div(string n,int d,string &s,int &b)
{
int a,l=n.size();
s="";
b=0;
for(int i=0;i<l;i++)//从高位到低位逐位相除
{
a=b*10+(n[i]-'0');
b=a%d;
s.push_back(a/d+'0');
}
int f=0;
l=s.size()-1;
for(;f<l&&s[f]=='0';f++); //去除前导0
s=s.substr(f);
}