码迷,mamicode.com
首页 > 编程语言 > 详细

c++高精度

时间:2020-05-18 20:34:37      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:case   cas   etc   color   switch   can   end   数据   ring   

#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("\n");
//    printf("%d %d\n",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\n",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;
}

 

c++高精度

标签:case   cas   etc   color   switch   can   end   数据   ring   

原文地址:https://www.cnblogs.com/sy666/p/12902244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!