大数相加/减/乘/除/取余 模板



string sum(string s1,string s2)//大数相加
{
    if(s1.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 s1,string s2)//大数相减
{
    string ans;
    bool ok=0;
    int len1=s1.size();
    int len2=s2.size();
    int len=max(len1,len2);
    for(int i=len1; i"0"+s1;
    for(int i=len2; i"0"+s2;
    if(s1string temp=s1;
        s1=s2;
        s2=temp;
        ok=1;
    }
    for(int i=len-1; i>=0; i--)
    {
        if(s1[i]1]-=1;
            s1[i]+=10;
        }
        char temp=s1[i]-s2[i]+'0';
        ans=temp+ans;
    }
    int pos=0;
    while(ans[pos]=='0' && posif(pos==len) return "0";
    if(ok) return "-"+ans.substr(pos);
    return ans.substr(pos);
}


string mul(string s1,string s2)//大数相乘
{
    int i,j,len1,len2;
    len1=s1.size();
    len2=s2.size();
    int *s=(int *)malloc(sizeof(int)*(len1+len2));  //分配存储空间
    for (i=0; i// 每个元素赋初值0
        s[i]=0;
    for (i=0; ifor (j=0; j1]+=(s1[i]-'0')*(s2[j]-'0');
    for (i=len1+len2-1; i>=0; i--)   // 这里实现进位操作
    {
        if(s[i]>=10)
        {
            s[i-1]+=s[i]/10;
            s[i]%=10;
        }
    }
    string ans;
    i=0;
    while(s[i]==0)           // 跳过头部0元素
        i++;
    for(j=0; i'0');
    if(ans.size()==0) //这里判断一下结果为0的情况
        ans="0";
    return ans;
}

bool Compare(string first,string second)//大数比较
{
    int i=0;
    while(first[i]=='0')
        i++;
    first.erase(0,i);
    i=0;
    while(second[i]=='0')
        i++;
    second.erase(0,i);
    int len1=first.size();
    int len2=second.size();
    if(len1return false;
    else if(len1==len2 && firstreturn false;
    return true;
}

string div(string s1,string s2,char ch)//大数相除以及求余
{
    string result,s;    //result用来保存商,s用来保存每次的运算时的被除数及最后的余数
    int count,i;
    /*if(b=="0")
    {
        cout<<"NULL"<
    int len=s1.size();
    for(int i=0; i0;
        s.push_back(s1[i]);
        while(Compare(s,s2))
        {

            s=sub(s,s2);
            count++;
        }

        result+=char(count+'0');    //s>b时加每次相除得到的商或者,s
    }
    i=0;
    while('0'==result[i])
        i++;
    result.erase(0,i);
    i=0;
    while(s[i]=='0')
        i++;
    s.erase(0,i);
    if(!s.size())//判断余数为0的情况
        s="0";
    if(!result.size())//判断商为0的情况
        result="0";
    if(ch=='/')
        return result;
    else
        return s;
}

你可能感兴趣的:(一些算法模板)