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

    Description

    Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比
    赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你
    决定写一个程序来教训他。

    Input

    共两行: 第一行:一个数A。 第二行:一个数B。
    0 < A , B ≤ 10 ^ 10000。

    Output

    一行,表示A和B的最大公约数。

    题解:

      高精度

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    #define ll long long
    #define MN 1255
    #define Base 100000000
    #define Width 8
    char readin[MN*8];
    struct HPint{
        ll s[MN],len;
        void init(){memset(s,0,sizeof s);len=0;}
        HPint operator =(ll num){
            init();
            for(;num>0;){len++;s[len]=num%Base;num/=Base;}
            return *this;
        }
        HPint 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 HPint &a)const{
            if(a.len!=len) return len<a.len;
            for(int i=a.len;i>=1;i--)if(a.s[i]!=s[i])return s[i]<a.s[i];
            return 0;
        }
        bool operator ==(const HPint &a)const{
            return !(a<*this)&&!(*this<a);
        }
        HPint operator -(const HPint &a)const{
            HPint ans;ans.init();ans.len=len;
            for(int i=1;i<=len;i++){
                ans.s[i]+=s[i]-a.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(){
            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]);}
        }
    };
    HPint a,b,res;
    int cnt;
    HPint gcd(HPint x,HPint y){
        while(!(x==y)){
            if(x<y)swap(x,y);
            if(x.check()&&y.check()) x.DIV2(),y.DIV2(),cnt++;
            else if(x.check()&&!y.check()) x.DIV2();
            else if(!x.check()&&y.check()) y.DIV2();
            else if(!x.check()&&!y.check()) x=x-y;
        }
        return x;
    }
    int main(){
        a.read();b.read();
        res=gcd(a,b);
        while(cnt--) res.MUL2();
        res.print();
        return 0;
    }

      来自PaperCloud的博客,未经允许,请勿转载,TKS!

  • 相关阅读:
    .NET实现Excel文件的读写 未测试
    权限管理设计
    struts1中配置应用
    POJ 2139 Six Degrees of Cowvin Bacon(floyd)
    POJ 1751 Highways
    POJ 1698 Alice's Chance
    POJ 1018 Communication System
    POJ 1050 To the Max
    POJ 1002 4873279
    POJ 3084 Panic Room
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/9052473.html
Copyright © 2011-2022 走看看