高精度集锦

· · 个人记录

#include <bits/stdc++.h>
using namespace std;
int n,m;
string s[510];
bool check(string a,string b){//判断a是否小于b
    if(a.size()<b.size()||(a.size()==b.size()&&a<=b))
        return true;
    return false; 
}
/*高精度加法 ↓*/
int plu[1030];
string my_plus(string a,string b){
    if(check(a,b)){
        string c;
        c=a;
        a=b;
        b=c;
    }
    memset(plu,0,sizeof(plu));
    int dis=a.size()-b.size();
    while(dis--){b="0"+b;}
    int n=a.size();
    string pl="";
    for(int i=n;i>=1;i--){
        plu[i]+=a[i-1]-'0'+b[i-1]-'0';
        while(plu[i]>=10){plu[i]-=10;plu[i-1]++;}
        pl=char(plu[i]+'0')+pl;
    }
    if(plu[0]!=0){pl=char(plu[0]+'0')+pl;}
    if(pl=="")pl="0";
    return pl;
}
/*高精度减法 ↓*/
int minu[1030];
string my_minus(string a,string b){
    memset(minu,0,sizeof(minu));
    int dis=a.size()-b.size();
    while(dis--){b="0"+b;}
    int n=a.size();
    string min="";
    for(int i=n;i>=1;i--){
        minu[i]+=a[i-1]-b[i-1];
        if(minu[i]<0){minu[i-1]--;minu[i]+=10;}
        min=char(minu[i]+'0')+min;
    }
    while(min[0]=='0'){min.erase(0,1);}
    if(min=="")min="0";
    return min;
}
/*高精度乘法 ↓*/
int multi[1030];
string my_multiply(string a,string b){
    memset(multi,0,sizeof(multi));
    int n=b.size(),m=a.size();
    for(int i=1;i<=n;i++){//b从后往前 第几位 
        for(int j=1;j<=m;j++){//a从后往前 第几位
            int k=i+j-1;
            multi[k]+=(a[m-j]-'0')*(b[n-i]-'0');
            while(multi[k]>=10){multi[k]-=10;multi[k+1]++;}
        }
    }
    /*开始存数*/
    string mul="";
    int t=n+m-1;
    for(int i=1;i<=t;i++){
        while(multi[i]>=10){multi[i]-=10;multi[i+1]++;}
        mul=char(multi[i]+'0')+mul;
    }
    if(multi[n+m]!=0){mul=char(multi[n+m]+'0')+mul;}
    while(mul[0]=='0'&&mul[1]!='.')mul.erase(0,1);
    if(mul=="")mul="0";
    return mul;
}

/*高精度除法 ↓*/
int divi[1030];
string my_divide(string a,string b,int ac){
    memset(divi,0,sizeof(divi));
    int n=a.size(),m=b.size(),k;//取长度
    string c="",div="";
    bool flag=1;//没有输出过
    for(int i=0;i<n+ac;i++){//当前处理第几下标
        if(i==n){if(flag){div+="0";}div+=".";}
            if(i<n){if(c=="0")c="";c+=a[i];}
            else if(c!="0"){c+='0';}
        if(check(c,b)&&!(c==b)){div+="0";flag=0;continue;}//c<b
        k=0;//减了几次
        while(check(b,c)){c=my_minus(c,b);k++;}
        div+=(k+'0');
        flag=0;
    }
    while(div[0]=='0'&&div[1]!='.')
        div.erase(0,1);
    return div;
}
string change(int x){
    string y="";
    while(x){
        y=char(x%10+'0')+y;
        x/=10; 
    }
    return y;
}
int main(){

    return 0;
}