Ⅰ.高精度加法
 
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;
}