#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记录
急急急!!!