zoukankan      html  css  js  c++  java
  • [SDOI2009]SuperGCD

    https://www.luogu.com.cn/problem/P2152链接地址

    题目大意

    这道题就是让算两个非常非常非常非常大的数的最大公约数。如果你一上来就想到了更像减损术,恭喜你拿到了20分,但是剩下的80分就要用到高精度算法了。

    代码

    #include<bits/stdc++.h> 
    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]);} 
        }
    };
    bigint a,b,tans,c;
    int cnt=0;
    bigint GCD(bigint x,bigint y){
        while(!(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();
        tans.print();
        return 0;
    }

    然而我上面说的都是在扯淡。高精度还是python靠谱

    并不正的正解(简单解)

    import fractions
    print(fractions.gcd(int(input()),int(input())))

    好了,这就是所谓的python大法好了。

    rush!
  • 相关阅读:
    作业练习
    作业练习
    作业
    作业
    作业
    作业
    作业
    作业
    作业
    作业
  • 原文地址:https://www.cnblogs.com/LH2000/p/12511385.html
Copyright © 2011-2022 走看看