C++大数模板(加,减,乘,除等)

大数加大数

string add(string a,string b)
{
    string c;
    int len1=a.length(),len2=b.length(),len=max(len1,len2),ok=0;
    for(int i=len1; i<len; i++) a="0"+a;
    for(int i=len2; i<len; i++) b="0"+b;
    for(int i=len-1; i>=0; i--){
        char temp=a[i]+b[i]-'0'+ok;
        if(temp>'9') ok=1,temp-=10;
        else ok=0;
        c=temp+c;
    }
    if(ok) c="1"+c;
    return c;
}
View Code

大数减大数

string sub(string a,string b)
{
    string c;
    int len1=a.length(),len2=b.length(),len=max(len1,len2),ok=0;
    for(int i=len1; i<len; i++) a="0"+a;
    for(int i=len2; i<len; i++) b="0"+b;
    if(a<b){
        string temp=a;
        a=b;
        b=temp;
        ok=1;
    }
    for(int i=len-1; i>=0; i--){
        if(a[i]<b[i]){
            a[i-1]-=1;
            a[i]+=10;
        }
        char temp=a[i]-b[i]+'0';
        c=temp+c;
    }
    int pos=0;
    while(c[pos]=='0' && pos<len) pos++;//剔除前导 0
    if(pos==len) return "0";
    if(ok) return "-"+c.substr(pos);//负数特判即可(保证结果符号)
    return c.substr(pos);
}
View Code

大数乘整数

string mul(string a,int b)
{
    string c;
    char s;
    int len=a.length(),ok=0;
    for(int i=len-1; i>=0; i--){
        int temp=(a[i]-'0')*b+ok;
        ok=temp/10;
        s=temp%10+'0';
        c=s+c;
    }
    while(ok){
        s=ok%10+'0';
        c=s+c;
        ok/=10;
    }
    return c;
}
View Code

大数乘大数

string multiply(string a,string b){
    string sum;
    int flag=0;
    vector <int> result(a.size()+b.size(),0);
    //判断0
    if(a[0]=='0' || b[0]=='0'){
        sum.push_back('0');
        return sum;
    }
    //判断符号
    if(a[0]=='-'||b[0]=='-'){
        flag=1;
        if(a[0]=='-'&&b[0]=='-')
            flag=0;
        if(a[0]=='-')
            a=a.substr(1,a.size()-1);
        if(b[0]=='-')
            b=b.substr(1,b.size()-1);
    }
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    int num1,num2;
    for(int i=0;i<a.size();i++){
        for(int j=0;j<b.size();j++){
            num1=a[i]-'0';
            num2=b[j]-'0';
            result[i+j]+=num1*num2;
        }
    }
    for(int i=0;i<result.size();i++){
        if(result[i]>=10){
            result[i+1]+=result[i]/10;
            result[i]%=10;
        }
        sum.push_back(result[i]+'0');
    }
    reverse(sum.begin(),sum.end());
    int ind=-1;
    while(sum[++ind]=='0');
    if(ind!=-1)
        sum=sum.substr(ind);
    if(flag){
        cout<<'-';
    }
    return sum;
}
View Code

大数整除

string div(string a,int b)
{
    string c;
    int len=a.length(),ans=0;
    char s;
    for(int i=0; i<len; i++){
        ans=ans*10+a[i]-'0';
        s=ans/b+'0';
        ans%=b;
        c+=s;
    }
    int pos=0;
    while(pos<len && c[pos]=='0') pos++;
    if(pos==len) return "0";
    return c.substr(pos);
}
View Code

大数除大数

bool big(string a,string b,int i)
{
    for(int j=i; j<i+b.length(); j++){
        if(a[j]>b[j-i])return true;
        if(a[j]<b[j-i]) return false;
    }
    return true;
}
string Div(string a,string b)
{
    int i,p=0,lena=a.length(),ok=0,lenb=b.length();
    string c;
    for(i=0; i<lena; i++) c+='0';
    i=0;
    while(i<=lena-lenb){
        if(i>lena-lenb) break;
        while(big(a,b,i)||(i>0 && a[i-1]>'0')){
            for(int j=lenb-1; j>=0; j--) if(a[i+j]>=b[j]) a[i+j]-=b[j]-'0';
                else a[i+j-1]--,a[i+j]+=10+'0'-b[j];
            c[i+lenb-1]++;
        }
        i++;
    }
    string ans;
    int lenc=c.length();
    for(int i=0; i<lenc; i++){
        if(c[i]=='0'&&!ok) continue;
        ok=1;
        ans+=c[i];
    }
    return ans;
}
View Code

大数判相等

string solve(string s)
{
    int len=s.length(),x=0,y=len-1;;
    bool ok=false;
    for(int i=0; i<len; i++){
        if(s[i]=='.'){
            ok=true;
            break;//o(n)查找小数点
        }
    }
    if(ok){
        for(; y>=x; y--) if(s[y]!='0') break;
        if(s[y]=='.') y--;
    }
    for(; x<len-1; x++) if(s[x]!='0') break;
    if(s[x]=='.') x--;
    return s.substr(x,y-x+1);
}

bool Equal(string s1,string s2)
{
    if(s1[0]=='-' && s2[0]=='-'){
        s1=s1.substr(1);
        s2=s2.substr(1);
    }
    else if(s1[0]=='-' || s2[0]=='-'){
        if(s1[0]=='-') s1=s1.substr(1);
        if(s2[0]=='-') s2=s2.substr(1);
        s1=solve(s1);
        s2=solve(s2);
        if(s1=="0"&&s2=="0") return true;
        return false;
    }
    if(s1[0]=='+') s1=s1.substr(1);
    if(s2[0]=='+') s2=s2.substr(1);
    s1=solve(s1);
    s2=solve(s2);
    if(s1==s2) return true;
    return false;
}
View Code

浮点数的n次方

string Mul(string s,long long x)
{
    reverse(s.begin(),s.end());
    long cmp=0;
    for(int i=0; i<s.size(); i++){
        cmp=(s[i]-'0')*x+cmp;
        s[i]=(cmp%10+'0');
        cmp/=10;
    }
    while(cmp){
        s+=(cmp%10+'0');
        cmp/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}
string delete_later_zero(string s)
{
    int ok=1;
    for(int i=s.size()-1; i>=0; i--){
        if(s[i]=='0')s.erase(i);
        else if(s[i]=='.'){
            s.erase(i);
            ok=0;
        }
        else ok=0;
        if(ok==0) break;
    }
    return s;
}
string fac(string s,int n)
{
    if(n==0) return "1";
    string cmp="",count="";
    long long    x=0,point=0;
    for(int i=0; i<s.size(); i++)
        if(s[i]!='.'){
            cmp+=s[i];
            x=x*10+(s[i]-'0');
        }
        else point=s.size()-1-i;
    for(int i=1; i<n; i++) cmp=Mul(cmp,x);
    int ans_point=cmp.size()-n*point;
    if(ans_point<0){
        count+='.';
        for(int i=ans_point; i!=0; i++) count+='0';
    }
    string::iterator it=cmp.begin();
    if(ans_point>=0&&ans_point<cmp.size())
        cmp.insert(it+ans_point,'.');
    count+=(delete_later_zero(cmp));
    return count;//注意一下小于 1 的数的输出
}
View Code

大数取余

int MOD(string str,int mod)
{
    int rem=0;
    for(int i=0; i<str.length(); i++){
        rem=rem*10+str[i]-'0';
        rem=rem%mod;
    }
    return rem;
}
View Code

 

posted @ 2021-03-16 21:21  杯酒朝阳  阅读(101)  评论(0编辑  收藏  举报