Ⅰ.高精度加法
string add(string p,string q)
{
reverse(p.begin(),p.end());
reverse(q.begin(),q.end());
if(p.size()<q.size())
swap(p,q);
while(q.size()<p.size())
q+='0';
for(int i=0; i<p.size(); i++)
p[i]+=q[i]-'0'*2;
for(int i=0; i<p.size()-1; i++)//进位
if(p[i]>=10)
{
p[i+1]++;
p[i]%=10;
}
if(p.back()>=10)//C11
{
p.back()%=10;
p+=1;
}
for(int i=0; i<p.size(); i++)
p[i]+='0';
reverse(p.begin(),p.end());
return p;
}
Ⅱ.高精度乘法
string mul(string p,string q)
{
string ans;
int i,j,pl=p.size(),ql=q.size(),eps=pl+ql;
reverse(p.begin(),p.end());
reverse(q.begin(),q.end());
int a[pl],b[ql],c[eps];//动态数组
memset(c,0,sizeof c);
for(i=0;i<pl;i++)//初始化a数组
a[i]=p[i]-'0';
for(i=0;i<ql;i++)//初始化b数组
b[i]=q[i]-'0';
for(i=0;i<pl;i++)//初始化c数组
for(j=0;j<ql;j++)
c[i+j]+=a[i]*b[j];
for(i=0;i<eps;i++)
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
for(i=eps-1;i>0;i--)//注意范围,乘积至少保留一位
if(c[i] != 0)
break;
for(;i>=0;i--)
ans+=c[i]+'0';//ans不用reverse
return ans;
}
Ⅲ.高精度减法
string subtract(string p,string q)
{
//默认是大数减小数
/*if(p.size()<q.size() or (p.size()==q.size() and p<q))
swap(p,q);*/
reverse(p.begin(),p.end());
reverse(q.begin(),q.end());
while(q.size()<p.size())
q+='0';
for(int i=0; i<p.size(); i++)
{
if(p[i]<q[i])
{
p[i+1]--;
p[i]+=10;
}
p[i]=p[i]-q[i]+'0';
}
while(p.back()=='0' and p.size()>1)
p.pop_back();
reverse(p.begin(),p.end());
return p;
}
Ⅵ.高精度除法(需要高精乘法和加法)
string div2(string n)//求平均数
{
string ans;
for(int i=0; i<n.size(); i++)
{
int t=n[i]-'0';
if(!(t%2))
ans+=t/2+'0';
else
{
ans+=t/2+'0';
if(i!=n.size()-1)
n[i+1]+=10;
}
}
while(*ans.begin()=='0' and ans.size()>1)//去前导0
ans.erase(0,1);
return ans;
}
bool cmp(string p,string q)//返回p<q?
{
if(p.size()!=q.size())
return p.size()<q.size();
else return p<q;
}
string div(string p,string q)
{
string m,r=p,l="0";
while(cmp(l,r))
{
m=div2(add(l,r));
if(check(m,p,q))
return m;
else if(cmp(mul(q,m),p))
l=add(m,"1");
else r=subtract(m,"1");
}
return m;
}