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("\n");
    }
}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;
} 

 

posted @ 2018-10-26 16:13  qseer  阅读(224)  评论(0编辑  收藏  举报