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;
    }
  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/sy666/p/12902244.html
Copyright © 2011-2022 走看看