zoukankan      html  css  js  c++  java
  • SuperGCD(luogu 2152)

    题目描述

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

    输入输出格式

    输入格式:

    共两行: 第一行:一个数A。 第二行:一个数B。

    输出格式:

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

    输入样例
    12
    54
    输出样例
    6

    说明

    对于20%的数据,0 < A , B ≤ 10 ^ 18。 对于100%的数据,0 < A , B ≤ 10 ^ 10000。


    这是一个简单的高精度重载运算符

    code

    #include<stdio.h> 
    #include<string.h>
    #include<algorithm> 
    using namespace std;
    const int mxn=1e4+10;
    struct BigInt {
        int num[mxn],len;
        void reset() {
            memset(num,0,sizeof(num));len=0;
        }
        BigInt operator-(const BigInt &x) {
            BigInt c;
            c.reset();
            c.len=max(x.len,len);
            for(int i=1;i<=c.len;++i) {
                c.num[i]+=(num[i]-x.num[i]);
                if(c.num[i]<0) {
                    c.num[i]+=10;
                    c.num[i+1]--;
                }
            }
            while(c.num[c.len]==0) c.len--; 
            return c;
        } 
        bool operator<(const BigInt &x) {
            if(len!=x.len) return len<x.len;
            for(int i=len;i>=1;--i) if(num[i]!=x.num[i]) return num[i]<x.num[i];  
            return false;
        }
        bool operator==(const BigInt &x) {
            if(len!=x.len) return false;
            for(int i=len;i>=1;--i) if(num[i]!=x.num[i]) return false;
            return true;
        }
        void read() {
            char str[mxn];
            memset(str,0,sizeof(str));
            scanf("%s",str);
            len=strlen(str);
            for(int i=1;i<=len;++i) num[i]=str[len-i]-'0';
        }
        void print() {
            for(int i=len;i;i--) {
                printf("%d",num[i]);
            }
            printf("
    ");
        }
    }a,b;
    int cnt;
    
    bool check(BigInt x) {
        if(x.num[1]%2==0) return 1;
        return 0;
    }
    BigInt div(BigInt x) {
        for(int i=x.len;i>1;i--) {
            x.num[i-1]+=(x.num[i]%2)*10;
            x.num[i]/=2;
        }
        x.num[1]/=2;
        while(x.num[x.len]==0) x.len--;
        return x;
    }
    BigInt mul(BigInt x) {
        int k=0;
        for(int i=1;i<=x.len;++i) {
            x.num[i]=x.num[i]*2+k;
            k=0;
            if(x.num[i]>=10) {
                k=x.num[i]/10;
                x.num[i]%=10;
                if(i==x.len)  x.len++;
            }
        }
        return x;
    }
    
    int main() 
    {
        a.read(),b.read();
        while(!(a==b)) {
            if(a<b) swap(a,b);
            bool fa=check(a),fb=check(b);
            if(fa&&fb) {
                a=div(a);
                b=div(b);
                cnt++;
            }
            else if(fa) a=div(a);
            else if(fb) b=div(b);
            else a=a-b;
        } 
        while(cnt--) a=mul(a);
        a.print();
        return 0;
    } 
  • 相关阅读:
    接口开发中的 RestTemplate 传参问题
    逆流成河:五年软件开发生涯
    .NET Web开发技术简单整理
    2011-05-29 21:48 VS.NET2010水晶报表安装部署[VS2010]
    WPF 基础到企业应用系列3——WPF开发漫谈
    C# WinForm开发系列
    接口和委托的区别
    通过jquery触发select自身的change事件
    php去掉字符串中的最后一个字符和汉字
    Go语言学习之数据类型
  • 原文地址:https://www.cnblogs.com/qseer/p/9857023.html
Copyright © 2011-2022 走看看