zoukankan      html  css  js  c++  java
  • c++高精度

    #include<stdio.h>
    #include<string.h>
    #define yw 10000
    //yw表示压4位数 
    struct node{
        int s[10001];//s存储数据 
        int len,zf;//len存储位数,zf存储正负(1为正-1为负) 
    };
    char dr[1000005],k1;
    void print(const struct node& a){
        if(a.zf==-1)printf("-");
        printf("%d",a.s[a.len]);
        for(int i=a.len-1;i>0;i--)printf("%04d",a.s[i]);
        printf("
    ");
    //    printf("%d %d
    ",a.zf,a.len);
        return;
    }
    void print1(const struct node& a){
        if(a.zf==-1)printf("-");
        printf("%d",a.s[a.len]);
        for(int i=a.len-1;i>0;i--)printf("%04d",a.s[i]);
        return;
    }
    bool operator < (const struct node& a,const struct node& b){
        if(a.zf*b.zf<0)return a.zf<b.zf;
        if(a.len!=b.len)return a.len<b.len;
        for(int i=a.len;i>0;i--){
            if(a.s[i]!=b.s[i])return a.s[i]<b.s[i];
        }
        return 0;
    }
    bool operator <= (const struct node& a,const struct node& b){
        if(a.zf*b.zf<0)return a.zf<b.zf;
        if(a.len!=b.len)return a.len<b.len;
        for(int i=a.len;i>0;i--){
            if(a.s[i]!=b.s[i])return a.s[i]<b.s[i];
        }
        return 1;
    }
    bool operator > (const struct node& a,const struct node& b){
        if(a.zf*b.zf<0)return a.zf>b.zf;
        if(a.len!=b.len)return a.len>b.len;
        for(int i=a.len;i>0;i--){
            if(a.s[i]!=b.s[i])return a.s[i]>b.s[i];
        }
        return 0;
    }
    bool operator >= (const struct node& a,const struct node& b){
        if(a.zf*b.zf<0)return a.zf>b.zf;
        if(a.len!=b.len)return a.len>b.len;
        for(int i=a.len;i>0;i--){
            if(a.s[i]!=b.s[i])return a.s[i]>b.s[i];
        }
        return 1;
    }
    struct node fu(struct node a){
        a.zf=-a.zf;
        return a;
    }
    struct node operator + (struct node a,struct node b){
        struct node c;int x;
        if(a.zf*b.zf>0){
            memset(&c,0,sizeof(c));
            c.len=1;x=0;
            if(a.zf==-1&&b.zf==-1)c.zf=-1;else c.zf=1;
            while(c.len<=a.len||c.len<=b.len){
                c.s[c.len]=a.s[c.len]+b.s[c.len]+x;
                x=c.s[c.len]/yw;
                c.s[c.len]%=yw;
                c.len++;
            }
            c.s[c.len]=x;
            if(c.s[c.len]==0)c.len--;
            return c;
        }else{
            if(a.zf==-1){c=a;a=b;b=c;}
            if(b.zf==-1){b=fu(b);}
            if(a<b){c=a;a=b;b=c;memset(&c,0,sizeof(c));c.zf=-1;}
            else{memset(&c,0,sizeof(c));c.zf=1;}
            int i=1;
            while(i<=a.len&&i<=b.len){
                if(a.s[i]<b.s[i]){
                    a.s[i]+=yw;
                    a.s[i+1]--;
                }
                c.s[i]=a.s[i]-b.s[i];
                i++;
            }
            c.len=i;
            while(c.s[c.len]==0&&c.len>1)c.len--;
            if(c.len==1&&c.s[1]==0)c.zf=1;//默认0为正 
            return c;
        }
    }
    struct node operator -(const struct node& a,const struct node& b){
        return a+fu(b);
    }
    struct node read(){
        struct node c;
        memset(&c,0,sizeof(c));
        scanf("%s",dr);
        int lendr=strlen(dr);
        if(dr[0]!='-'){
            c.zf=1;
            c.len=lendr/4;
            for(int i=1;i<=c.len;i++)
                c.s[i]=(dr[lendr-4*i]^48)*1000+(dr[lendr-4*i+1]^48)*100+(dr[lendr-4*i+2]^48)*10+(dr[lendr-4*i+3]^48);
            if(lendr%4!=0){
                c.len++;
                int lendr1=lendr%4;
                c.s[c.len]=0;
                for(int i=0;i<lendr1;i++)c.s[c.len]=c.s[c.len]*10+(dr[i]^48);
                //while((--lendr1)>=0)c.s[c.len]=c.s[c.len]*10+(dr[lendr1]^48);
            }
        }else{
            c.zf=-1; 
            c.len=(lendr-1)/4;
            for(int i=1;i<=c.len;i++)
                c.s[i]=(dr[lendr-4*i]^48)*1000+(dr[lendr-4*i+1]^48)*100+(dr[lendr-4*i+2]^48)*10+(dr[lendr-4*i+3]^48);
            if((lendr-1)%4!=0){
                c.len++;
                int lendr1=(lendr-1)%4+1;
                c.s[c.len]=0;
                for(int i=1;i<lendr1;i++)c.s[c.len]=c.s[c.len]*10+(dr[i]^48);
                //-while((--lendr1)>0)c.s[c.len]=c.s[c.len]*10+(dr[lendr1]^48);
            }
        }
        return c;
    }
    struct node operator * (const struct node& a,const struct node& b){
        struct node c;int x;
        memset(&c,0,sizeof(c));
        c.zf=a.zf*b.zf;
        for(int i=1;i<=a.len;i++){
            x=0;
            for(int j=1;j<=b.len;j++){
                c.s[i+j-1]=a.s[i]*b.s[j]+x+c.s[i+j-1];
                x=c.s[i+j-1]/yw;
                c.s[i+j-1]%=yw;
            }
            c.s[i+b.len]=x;
        }
        c.len=a.len+b.len;
        while(c.s[c.len]==0&&c.len>1)c.len--;
        if(c.len==1&&c.s[1]==0)c.zf=1;
        return c;
    }
    struct node operator / (const struct node& a,const int& b){
        struct node c;
        if(b==0)throw(-1);
        if(a.zf*b>=0)c.zf=1;else c.zf=-1;
        int x=0;
        for(int i=a.len;i>0;i--){
            c.s[i]=(x*yw+a.s[i])/b;
            x=(x*yw+a.s[i])%b;
        }
        c.len=a.len;
        while(c.s[c.len]==0&&c.len>1)c.len--;
        if(c.len==1&&c.s[1]==0)c.zf=1;
        return c;
    }
    struct node chu(struct node a,int b,int *d){//返回d为模数 
        struct node c;
        if(b==0)throw(-1);
        if(a.zf*b>=0)c.zf=1;else c.zf=-1;
        if(b<0)b=-b; 
        int x=0;
        for(int i=a.len;i>0;i--){
            c.s[i]=(x*yw+a.s[i])/b;
            x=(x*yw+a.s[i])%b;
        }
        c.len=a.len;
        while(c.s[c.len]==0&&c.len>1)c.len--;
        if(c.len==1&&c.s[1]==0)c.zf=1;
        *d=x;
        return c;
    }
    struct node numcpy(struct node p,int det){//高精除高精要用 
        struct node q;
        memset(&q,0,sizeof(q));
        for(int i=1;i<=p.len;i++)q.s[i+det-1]=p.s[i];
        q.zf=1;
        q.len=p.len+det-1;
        return q;
    } 
    struct node operator / (struct node a,struct node b){
        int i;
        struct node tmp,c;
        if(a.zf*b.zf>=0)c.zf=1;else c.zf=-1;
        c.len=a.len-b.len+1;
        for(i=c.len;i>0;i--){
            
            tmp=numcpy(b,i);
            while(a>=tmp){c.s[i]++;a=a-tmp;}
        }
        while(c.len>0&&c.s[c.len]==0)c.len--;
        return c;
    }
    struct node ksm(struct node m,struct node n){
        struct node ans={{0,1},1,1};
        while(n.len>1||n.s[1]!=0){
            if(n.s[1]&1)ans=ans*m;
            m=m*m;
            n=n/2;
        }
        return ans;
    }
    int main(){
        struct node k,s,ans;
        k=read();
        char k1;
        getchar();
        scanf("%c",&k1);
        s=read();
    //    print(k);printf("%c
    ",k1);print(s);
        switch(k1){
            case '+':ans=k+s;break;
            case '-':ans=k-s;break;
            case '*':ans=k*s;break;
            case '/':ans=k/s;break;
            case '^':ans=ksm(k,s);break;
            default:break;
        }
        print(ans);
        return 0;
    }
  • 相关阅读:
    Map 嵌套存储Map
    LinkedList;以及迭代器Iterator
    计算某字符串中大写字母、小写字母以及数字的个数
    String字符串转多种类型及多种方法的应用
    String类的构造方法
    String类(附件)
    (五)Kubernetes集群安装
    (四)Kubernetes 网络通讯方式
    (三)Kubernetes-Pod概念
    (二)Kubernetes组件说明
  • 原文地址:https://www.cnblogs.com/sy666/p/12902244.html
Copyright © 2011-2022 走看看