高精模板

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll MAXLEN=1255,BASE=100000000,WIDTH=8;//压位 
char readin[MAXLEN*8]={};
struct bigint{//高精模板 
    ll s[MAXLEN],len;
    void init(){memset(s,0,sizeof(s));len=0;}
    bigint operator =(ll num){init();for(;num>0;){len++;s[len]=num%BASE;num/=BASE;}return *this;}
    bigint operator =(const char *str){
        init();
        ll numlen=strlen(str);len=(numlen+WIDTH-1)/WIDTH;
        for(int i=numlen-1,t=0,w;i>=0;i--,w*=10){
            if((numlen-i-1)%WIDTH==0){w=1;t++;}
            s[t]+=w*(str[i]-48);
        }
        return *this;
    }
    bool operator <(const bigint &b)const{
        if(b.len!=len)return len<b.len;
        for(int i=b.len;i>=1;i--)if(b.s[i]!=s[i])return s[i]<b.s[i];
        return 0;
    }
    bool operator ==(const bigint &b)const{return !(b<*this)&&!(*this<b);}
    bigint operator -(const bigint &b)const{
        bigint ans;ans.init();ans.len=len;
        for(int i=1;i<=len;i++){
            ans.s[i]+=s[i]-b.s[i];
            if(ans.s[i]<0){ans.s[i]+=BASE;ans.s[i+1]--;}
        }
        for(;ans.s[ans.len]==0&&ans.len>0;ans.len--);
        return ans;
    }
    void MUL2(){
        for(int i=1;i<=len;i++)s[i]*=2;len+=5;
        for(int i=1;i<=len;i++){
            s[i+1]+=s[i]/BASE;
            s[i]%=BASE;
        }
        for(;s[len]==0&&len>0;len--);
    }
    void DIV2(){
        len+=5;
        for(int i=len;i>=1;i--){
            if(s[i]&1)s[i-1]+=BASE;
            s[i]/=2;
        }
        for(;s[len]==0&&len>0;len--);
    }
    bool check_jo(){
        if(len==0)return 1;
        else return s[1]%2==0;
    }
    void read(){memset(readin,0,sizeof(readin));scanf("%s",readin);*this=readin;}
    void print(){
        if(len==0)printf("0");
        else{printf("%lld",s[len]);for(int i=len-1;i>=1;i--)printf("%08lld",s[i]);}//注意输出的时候除了第一位其他不够位数都用0补齐 
    }
};
bigint a,b,tans,c;
int cnt=0;
bigint GCD(bigint x,bigint y){//楼下辗转相减的思路 
    for(;!(x==y);){
        if(x<y)swap(x,y);
        if(x.check_jo()&&y.check_jo()){
            x.DIV2();y.DIV2();cnt++;
        }else if(x.check_jo()&&!y.check_jo()){
            x.DIV2();
        }else if(!x.check_jo()&&y.check_jo()){
            y.DIV2();
        }else if(!x.check_jo()&&!y.check_jo()){
            c.init();x=x-y;
        }
    }
    return x;
}
int main(){
    a.init();b.init();tans.init();
    a.read();b.read();tans=GCD(a,b);
    for(;cnt>0;cnt--)tans.MUL2();//统计乘2操作的个数 
    tans.print();
    return 0;
}

 

posted @ 2021-03-25 18:46  cono奇犽哒  阅读(64)  评论(0)    收藏  举报