高精板子合集(string版本)

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int a[N],b[N],c[N];
inline string zhuan(int x){//int转化string 
    string ant="";
    while(x){
        ant=char(x%10+'0')+ant;
        x/=10;
    }
    return ant;
}
inline bool cmp(string x,string y){//比较两个高精string数的大小 
    int len=x.size(),ten=y.size();
    if(len!=ten){
        return len>ten;
    }
    for(int i=0;i<len;++i){
        if(x[i]!=y[i]){
            return x[i]>y[i];
        }
    }
    return true;
}//若x>=y返回true,否则为false 
inline string jia1(string x,int y){//高精加低精 
    //初始化 
    memset(a,0,sizeof(a));
    int len=x.size();
    //储存
    for(int i=0;i<len;++i){
        a[i]=x[len-i-1]-'0';
    }
    //操作 
    a[0]+=y;
    //进位 
    for(int i=0;i<len;++i){
        if(a[i]>9){
            a[i+1]+=a[i]/10;
            a[i]%=10;
            if(i==len-1){
                len++;
            }
            continue;
        }
        break;
    }
    //输出 
    string ant="";
    for(int i=len-1;i>=0;--i){
        ant+=char(a[i]+'0');
    }
    return ant;
}
inline string jia2(string x,string y){//高精加高精 
    //初始化 
    int len=x.size(),ten=y.size();
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    int k=max(len,ten);
    //储存 
    for(int i=0;i<len;++i){
        a[i]=x[len-i-1]-'0';
    }
    for(int i=0;i<ten;++i){
        b[i]=y[ten-i-1]-'0';
    }
    //操作 
    for(int i=0;i<k;++i){ 
        c[i]=a[i]+b[i];
    }
    //进位 
    for(int i=0;i<k;++i){
        if(c[i]>9){
            c[i+1]++;
            c[i]-=10;
            if(i==k-1){
                k++;
            }
        }
    }
    //输出
    string ant="";
    for(int i=k-1;i>=0;--i){
        ant+=char(c[i]+'0');
    }
    return ant;
}
//注意:此处的高精减法默认x>=y 
inline string jian(string x,string y){//这是为高精除高精写的减法,正确的写法您需要特判x==y的情况
    //初始化 
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    int len=x.size(),ten=y.size();
    int k=max(len,ten);
    //储存 
    for(int i=0;i<len;++i){
        a[i]=(x[len-i-1]-'0');
    }
    for(int i=0;i<ten;++i){
        b[i]=(y[ten-i-1]-'0');
    }
    //操作 
    for(int i=0;i<k;++i){
        a[i]-=b[i];
    }
    //退位 
    for(int i=0;i<k;++i){
        if(a[i]<0){
            a[i+1]--;
            a[i]+=10;
        }
    }
    //消除前导零 
    while(k&&!a[k-1]){
        k--;    
    }
    //输出 
    string ant="";
    for(int i=k-1;i>=0;--i){
        ant+=char(a[i]+'0');
    }
    return ant;
}
inline string cheng1(string x,int y){//高精乘低精 
    //初始化 
    int len=x.size();
    memset(a,0,sizeof(a));
    //储存 
    for(int i=0;i<len;++i){
        a[i]=x[len-i-1]-'0';
    }
    //操作 
    for(int i=0;i<len;++i){
        a[i]*=y;
    }
    //进位
    for(int i=0;i<len;++i){
        if(a[i]>9){
            a[i+1]+=a[i]/10;
            a[i]%=10;
            if(i==len-1){
                len++;
            }
        }
    }
    //消去前导零 
    while(len>1&&!a[len-1]){
        len--;
    }
    string ant="";
    for(int i=len-1;i>=0;--i){
        ant+=char(a[i]+'0');
    }
    return ant;
}
inline string cheng2(string x,string y){//高精乘高精 
    //初始化 
    int len=x.size(),ten=y.size();
    int k=len+ten-1;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    //储存 
    for(int i=0;i<len;++i){
        a[i]=(x[len-i-1]-'0');
    }
    for(int j=0;j<ten;++j){
        b[j]=(y[ten-j-1]-'0');
    }
    //操作 
    for(int i=0;i<len;++i){
        for(int j=0;j<ten;++j){
            c[i+j]+=a[i]*b[j];
        }
    }
    //进位 
    for(int i=0;i<=k;++i){
        if(c[i]>9){
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
    }
    //消去前导零 
    while(k&&!c[k]){
        k--;
    }
    //输出 
    string ant="";
    for(int i=k;i>=0;--i){
        ant+=char(c[i]+'0');
    }
    return ant;
}
inline string chu1(string x,int y){//高精除低精 
    //初始化 
    int len=x.size();
    int yu=0;
    bool flag=0;//是否有数字 
    string ans="";
    //操作 
    for(int i=0;i<len;++i){
        yu=yu*10+(x[i]-'0');
        if(flag){
            ans+=char(yu/y+'0');
            yu%=y;
            continue;
        }
        if(yu>=y){
            flag=1;
            ans+=char(yu/y+'0');
            yu%=y;
        }
    }
    //输出 
    return ans;
}
inline string chu2(string x,string y){//高精除高精
    //比较 
    if(!cmp(x,y)){
        return "0";
    }
    //初始化 
    int len=x.size();
    string yu="",ans="";
    bool flag=0;
    //操作 
    for(int i=0;i<len;++i){
        yu+=x[i];
     if(yu=="0"){
       yu="";
     }
int tim=0; while(cmp(yu,y)){ yu=jian(yu,y); tim++; }
     if(flag){ ans+=char(tim+'0'); continue; } if(tim){ flag=1; ans+=char(tim+'0'); } } //输出 return ans; } inline int mo1(string x,int y){//高精模低精 //初始化 int len=x.size(); int yu=0; //操作 for(int i=0;i<len;++i){ yu=yu*10+(x[i]-'0'); yu%=y; } //输出 return yu; } inline string mo2(string x,string y){//高精模高精 //比较 if(!cmp(x,y)){ return x; } //初始化 int len=x.size(); string yu=""; //操作 for(int i=0;i<len;++i){ yu+=x[i];
     if(yu=="0"){
      yu="";
      } 
while(cmp(yu,y)){ yu=jian(yu,y); } } //输出 return yu; } int main(){ //freopen("ask.in","r",stdin); //freopen("ask.out","w",stdout); return 0; } /** *  ┏┓   ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃       ┃ * ┃   ━   ┃ ++ + + + * ████━████+ * ◥██◤ ◥██◤ + * ┃   ┻   ┃ * ┃       ┃ + + * ┗━┓   ┏━┛ *   ┃   ┃ + + + +Code is far away from   *   ┃   ┃ + bug with the animal protecting *   ┃    ┗━━━┓ 神兽保佑,代码无bug  *   ┃        ┣┓ *   ┃        ┏┛ *  ┗┓┓┏━┳┓┏┛ + + + + *    ┃┫┫ ┃┫┫ *    ┗┻┛ ┗┻┛+ + + + */
原文地址:https://www.cnblogs.com/ThinkofBlank/p/10154457.html