MLE 20pts
查看原帖
MLE 20pts
852637
songtaoran楼主2024/4/23 20:24
#include<bits/stdc++.h>
using namespace std;
#define Max(a, b) ((a) > (b) ? (a) : (b))
struct data{
	int num[10003];
	int len;
	char op;
	data(){memset(num, 0, sizeof num); len = 1; op = '+';}
};
void print(data c);
bool operator > (data a, data b){
	if(a.op == '+' && b.op == '-')  return true;
    if(a.op == '-' && b.op == '+')  return false;
    if(a.len > b.len)               return true;
    if(a.len < b.len)               return false;
    if(a.op == '-' && b.op == '-'){
        for(int i = a.len; i >= 1; i--)
            if(a.num[i] > b.num[i])       return false;
            else if(a.num[i] < b.num[i])  return true;
            else if(a.num[i] == b.num[i]) continue;
    }
    if(a.op == '+' && b.op == '+'){
        for(int i = a.len; i >= 1; i--)
            if(a.num[i] > b.num[i])       return true;
            else if(a.num[i] < b.num[i])  return false;
            else if(a.num[i] == b.num[i]) continue;
    }
    return false;
}
bool operator < (data a, data b){
	if(a.op == '+' && b.op == '-') return false;
    if(a.op == '-' && b.op == '+') return true;
    if(a.len > b.len)              return false;
    if(a.len < b.len)              return true;
    if(a.op == '-' && b.op == '-'){
        for(int i = a.len; i >= 1; i--)
            if(a.num[i] > b.num[i])       return true;
            else if(a.num[i] < b.num[i])  return false;
            else if(a.num[i] == b.num[i]) continue;
    }
    if(a.op == '+' && b.op == '+'){
        for(int i = a.len; i >= 1; i--)
            if(a.num[i] > b.num[i])       return false;
            else if(a.num[i] < b.num[i])  return true;
            else if(a.num[i] == b.num[i]) continue;
    }
    return false;
}
bool operator == (data a, data b){
	if(a.len == b.len){
        for(int i = a.len; i >= 1; i--){
            if(a.num[i] != b.num[i]) return false;
            else 					 continue;
        }
        return true;
    }
    return false;
}
data numcopy(data a, int l){
	data c;
	for(int i = 1; i <= a.len; i++) c.num[i + l - 1] = a.num[i];
	c.len = a.len + l - 1;
	c.op = '+';
	return c;
}
data operator + (data a, data b){
	data c;
	c.len = Max(a.len, b.len);
	for(int i = 1; i <= c.len; i++)
		c.num[i] = a.num[i] + b.num[i];
	for(int i = 1; i <= c.len; i++)
		if(c.num[i] >= 10){
			c.num[i + 1] += c.num[i] / 10;
			c.num[i] %= 10;
			c.len = Max(c.len, i + 1);
		}
	while(c.len && !c.num[c.len]) c.len--;
	return c;
}
data operator - (data a, data b){
	data c, tmp;
	c.len = Max(a.len, b.len);
	if(b > a){
		c.op = '-';
		tmp = b; b = a; a = tmp;
	}
	for(int i = 1; i <= c.len; i++)
		c.num[i] = a.num[i] - b.num[i];
	for(int i = 1; i <= c.len; i++)
		if(c.num[i] < 0){
			c.num[i] += 10;
			c.num[i + 1]--;
		}
	while(c.len && !c.num[c.len]) c.len--;
	return c;
}
data operator * (data a, data b){
	data c;
	c.len = a.len + b.len + 1;
	for(int i = 1; i <= a.len; i++)
		for(int j = 1; j <= b.len; j++)
			c.num[i + j - 1] += a.num[i] * b.num[j];
	for(int i = 1; i <= c.len; i++)
		if(c.num[i] >= 10){
			c.num[i + 1] += c.num[i] / 10;
			c.num[i] %= 10;
			c.len = Max(c.len, i + 1);
		}
	while(c.len && !c.num[c.len]) c.len--;
	return c;
}
data operator / (data a, data b){
	data c;
	c.len = a.len - b.len + 1;
	for(int i = c.len; i >= 1; i--){
		data t = numcopy(b, i);
		while(a > t || a == t){
			c.num[i]++;
			a = a - t;
		}
	}
	while(c.num[c.len] == 0 && c.len > 1) c.len--;
	return c;
}
data operator % (data a, data b){
	data c = a - a / b * b;
	while(c.len && !c.num[c.len]) c.len--;
	return c;
}
void input(data &a){
	string s1;
	cin >> s1;
	if(s1[0] == '-'){a.op = '-'; s1.erase(s1.begin());}
	for(int i = 1; i <= s1.size(); i++)
		a.num[i] = s1[s1.size() - i] - '0';
	a.len = s1.size();
}
void print(data c){
	if(c.op == '-') cout << "-";
	bool flag = false;
	for(int i = c.len; i >= 1; i--)
		if(c.num[i] || flag == true){
			cout << c.num[i];
			flag = true;
		}
	if(!flag) puts("0");
	else puts("");
}
data GCD(data a, data b){
	data c;
	if(b.num[b.len] == 0) b.len = 1;
	if(b == c) return a;
	c = a % b;
	return GCD(b, c);
}
int main(){
	data a, b, c;
	input(a);
	input(b);
	c = GCD(a, b);
	print(c);
	return 0;
}

MLE记录
急急急!!!

2024/4/23 20:24
加载中...