zoukankan      html  css  js  c++  java
  • 高精 by jzzcjb

    每个OIER都应该有一个属于自己的高精模板

                                                        ——沃兹·基·硕德华

     高精板子

    支持 min,max,判==,比较大小,正数减负数,负数减正数,负数加正数,负数乘正数,高精除低精(含正负),int 转高精,高精读入输出(含正负)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct bign{
        int len;
        int num[15010];
        bool flag;
        bign(){len=1;flag=0;memset(num,0,sizeof num);}
        bign(int x){
            len=0;flag=(x<0);x=(x<0)?-x:x;
            while(x) num[++len]=x%10,x/=10;
        }
        void read(){
            memset(num,0,sizeof(num));
            char s[100001];cin>>s;len=strlen(s);
            if(s[0]=='-'){flag=1;len--;
                for(int i=1;i<=len;i++)
                num[i]=s[len-i+1]-'0';
            }
            else{flag=0;
                for(int i=1;i<=len;i++)
                num[i]=s[len-i]-'0';
            }
        }
        void write(){
            if(flag&&num[len]!=0) cout<<"-";
              for(int i=len;i>=1;i--) cout<<num[i];
        }
    };
    void Swap(bign &a,bign &b){
        bign c;
        c=a;a=b;b=c;
    }
    bool operator < (bign a,bign b){
        if(a.len!=b.len) return (a.len<b.len);
        for(int i=a.len;i>=1;i--)
        if(a.num[i]!=b.num[i]) return (a.num[i]<b.num[i]);
    }
    bool operator > (bign a,bign b){
        return (a<b)?0:1;
    }
    bool operator == (bign a,bign b){
        if(a.len!=b.len)return 0;
        for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
        return 1;
    }
    bign max(bign A,bign B){return (A>B)?A:B;}
    bign operator - (bign a,bign b);
    bign operator + (bign a,bign b){
        bign ans;
        if(a.flag&&b.flag) ans.flag=1;
        if(a.flag&&!b.flag){b.flag=1;return a-b;}
        if(!a.flag&&b.flag){a.flag=1;return b-a;}
        int i=1,x=0;
        while(i<=a.len||i<=b.len){
            ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
            x=ans.num[i]/10;ans.num[i]%=10;  i++;
        }
        ans.num[i]=x;
        if(!ans.num[i])i--;
        ans.len=i;
        return ans;
    }
    bign operator - (bign a,bign b){
        bign ans;
        if(a.flag&&b.flag) ans.flag=1;
        if(a.flag&&!b.flag){b.flag=1;return a+b;}
        if(!a.flag&&b.flag){a.flag=0;return a+b;}
        if(a==b)return ans;
        if(a<b) Swap(a,b),ans.flag^=1;
        for(int i=1;i<=a.len;i++){
            if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
            ans.num[i]=a.num[i]-b.num[i];
            if(ans.num[i]<0){
                ans.num[i]+=10; a.num[i+1]--;
            }
        }
        int len=max(a.len,b.len);
        while(ans.num[len]<=0&&len>1)len--;
        ans.len=len;
        return ans;
    }
    bign operator * (bign a,bign b){
        bign ans;
        ans.flag=a.flag^b.flag;
        int len=a.len+b.len;
        for(int i=1;i<=a.len;i++){
            int x=0;
            for(int j=1;j<=b.len;j++){
                ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
                x=ans.num[i+j-1]/10;
                ans.num[i+j-1]%=10;
            }
            ans.num[i+b.len]+=x;
        }
        while(!ans.num[len] && len>1)len--;
        ans.len=len;
        return ans;
    }
    bign operator /(bign a,int b){
        bign ans;
        ans.flag=a.flag^(b<0);
        b=b<0?-b:b;
        int len=a.len;
        for(int i=len,x=0;i>=1;i--){
            x=x*10+a.num[i];
            ans.num[i]=x/b;
            x%=b;
        }
        while(!ans.num[len]&&len>1) len--;
        ans.len=len;
        return ans;
    }
    
    int main(){
        A.read();B.read();
        B.write();
    }

     经过总计超过24小时的调试和发疯,请放心食用

  • 相关阅读:
    Zuul转发请求时HttpHostConnectException can't cast to ZuulException问题解决方法
    mysql循环插入千万级数据
    ssh登录原理及免密登录配置
    mysql binlog抽取某个表的数据
    ssh方式请求gitlab需要密码解决方法
    linux使用shell脚本停止java进程
    centos7安装docker-ce
    FutureTask详解
    Boolean.getBoolean用法
    mysql对emoji的支持
  • 原文地址:https://www.cnblogs.com/jzzcjb/p/9762803.html
Copyright © 2011-2022 走看看