大数相加减以及相乘模板

//无论开多大的数都可以,用的很爽;
string sum(string s1,string s2)
{
    if(s1.length()<s2.length())
    {
        string temp=s1;
        s1=s2;
        s2=temp;
    }
    int i,j;
    for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    {
        s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
        if(s1[i]-'0'>=10)
        {
            s1[i]=char((s1[i]-'0')%10+'0');
            if(i) s1[i-1]++;
            else s1='1'+s1;
        }
    }
    return s1;
}
string sub(string str1,string str2)//高精度减法
{
    string str;
    int tmp=str1.length()-str2.length();
    int cf=0;
    for(int i=str2.length()-1;i>=0;i--)
    {
        if(str1[tmp+i]<str2[i]+cf)
        {
            str=char(str1[tmp+i]-str2[i]-cf+'0'+10)+str;
            cf=1;
        }
        else
        {
            str=char(str1[tmp+i]-str2[i]-cf+'0')+str;
            cf=0;
        }
    }
    for(int i=tmp-1;i>=0;i--)
    {
        if(str1[i]-cf>='0')
        {
            str=char(str1[i]-cf)+str;
            cf=0;
        }
        else
        {
            str=char(str1[i]-cf+10)+str;
            cf=1;
        }
    }
    str.erase(0,str.find_first_not_of('0'));//去除结果中多余的前导0
    return str;
}
 

相乘

string mul(string str1,string str2)
{
    string str(str1.size()+str2.size()+5,'0');
    reverse(str1.begin(),str1.end()); //翻转字符串str1
    reverse(str2.begin(),str2.end()); //翻转字符串str2
    int num=0,h=0;
    for(int i=0;i<str1.size();i++) //o(n^2)的方法模拟str1*str2(平时用的笔算乘法)
    {
        h=i;
        for(int j=0;j<str2.size();j++)
        {
            num+=str[h]-'0'+(str1[i]-'0')*(str2[j]-'0');
            str[h++]=num%10+'0';
            num/=10;
        }
        while(num)
        {
            str[h++]=num%10+'0';
            num/=10;
        }
    }
    for(int i=str1.size()+str2.size()+4;i>=0;i--) //去前导0
    {
        if(str[i]=='0')
           str.erase(i);
        else
           break;
    }
    reverse(str.begin(),str.end());//翻转结果的字符串str
    return str;
}

  

原文地址:https://www.cnblogs.com/yuanbo123/p/4887742.html