萌新刚学OI,高精求助
查看原帖
萌新刚学OI,高精求助
122720
W_Y_Z楼主2020/8/20 10:27

全T了

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
char s[maxn];
struct gj{
    int num[maxn],len;
    inline void clean(){
        memset(num,0,sizeof num);
        len=0;
    }    
    inline bool operator <=(const gj &a) {
        if(len!=a.len) return len<=a.len;
        for(register int i=len-1;i>=0;--i)
            if(num[i]!=a.num[i]) return num[i]<=a.num[i];
        return 1;
    }
    inline bool operator <(const gj &a) {
        if(len!=a.len) return len<a.len;
        for(register int i=len-1;i>=0;--i)
            if(num[i]!=a.num[i]) return num[i]<a.num[i];
        return 0;
    }
    inline bool operator >=(const gj &a) {
        if(len!=a.len) return len>=a.len;
        for(register int i=len-1;i>=0;--i)
            if(num[i]!=a.num[i]) return num[i]>=a.num[i];
        return 1;
    }
    inline bool operator >(const gj &a) {
        if(len!=a.len) return len>a.len;
        for(register int i=len-1;i>=0;--i)
            if(num[i]!=a.num[i]) return num[i]>a.num[i];
        return 0;
    }

    inline bool operator == (const gj &a){ 
        if(a.len!=len) return 0;
        for(register int i=len-1;i>=0;--i)
            if(num[i]!=a.num[i]) return 0;
        return 1;
    }
    inline bool operator != (const gj &a){ 
        if(a.len!=len) return 1;
        for(register int i=len-1;i>=0;--i)
            if(num[i]!=a.num[i]) return 1;
        return 0;
    }
    gj operator -(const gj &a){
		gj c; c.clean();
		c.len = max(a.len,len);
		for(register int i=0;i<c.len;++i){
			c.num[i]+=(num[i]-a.num[i]);
			if(c.num[i]<0){
				c.num[i]+=10;
				--c.num[i+1];
			}
		}
		while(c.num[c.len-1] == 0)	--c.len;
		return c;
	}
    gj operator +(const gj &a){
        gj c; c.clean();
        c.len=max(a.len,len);
        for(register int i=0;i<c.len;++i){
            c.num[i]+=(num[i]+a.num[i]);
            if(c.num[i]>=10){
                c.num[i]-=10;
                ++c.num[i+1];
            }
        }
        while(c.num[c.len]>0) ++c.len;
        return c;
    }
    gj read(){
        scanf("%s", s);
        len=strlen(s);
        for(register int i=len-1;i>=0;--i)
            num[i]=(s[len-i-1]^48);
    }
    gj print(){
        for(register int i=len-1;i>=0;--i)
            printf("%d", num[i]);
        // printf("\n");
    }
};
inline bool check(const gj &a){
    if(a.num[0]&1) return 0;
    else return 1;
}
gj div_2(gj a) {			//除以2的运算函数
    for(register int i=a.len-1;i>0;--i){
        a.num[i-1]+=(a.num[i]%2)*10;
        a.num[i]/=2;
    }
    a.num[0]/=2;
    while(a.num[a.len-1]==0)	a.len --;
    return a;
}
gj mul_2(gj a) {		//乘2的运算函数
    int into=0;
    for(register int i=0;i<a.len;++i){
        a.num[i]=a.num[i]*2+into;
        into=0;
        if(a.num[i]>=10) {
            into=a.num[i]/10;
            a.num[i]%=10;
            if(i==a.len-1)	++a.len;
        }
    }
    return a;
}
signed main(void){
    gj a,b;
    int cnt=0;
    a.read(),b.read();
    // a.print(),b.print();
    while(a!=b){
        if(a<b) swap(a,b);
        bool f1=check(a),f2=check(b);
        if(f1&&f2) ++cnt;
        if(f1) a=div_2(a);
        if(f2) b=div_2(b);
        if(f1==0&&f2==0) a=a-b;
        // a.print(),cout<<' ', b.print(),cout<<" "<<cnt,    cout<<endl;
    }
    for(register int i=1;i<=cnt;++i) a=mul_2(a);
    a.print(); puts("");
    return 0;
}
/*
5702887,9227465
*/
2020/8/20 10:27
加载中...