这道题直接写了我两个多小时……
主要是写高精度的时候还存在着一些小毛病,调了很久
在输入这一块卡了很久。
然后注意这里用while的形式写,不然会炸
最后即使我已经是用的万进制了,但是交上去还是有两个点超时
然后就开始漫长的改进,一直过不了那两个点。
然后突然发现,貌似这道题没有涉及到乘法。
那不就可以直接开10的九次方为一位了(10的9次方是int的最大数量级)
我交上去之后就AC了,全部测试点交上去总和4.6秒
然后原来我一个数开的是2500这么大,因为题目给的10000位,之前用万进制除以4就是2500
然后我现在改成了1200,大约是10000除以9
然后……
交上去总和3秒
直接快了一秒多
而且单个测试点最多也就0.7秒,而这道题的最大限制是2s
看来省空间的时候时间也省了很多
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;const int MAXN = 1200;
const int base = 1e9;
struct bignum
{int len, s[MAXN];bignum() { len = 0; memset(s, 0, sizeof(s)); }
};bignum operator - (bignum a, const bignum& b)
{for(int i = a.len; i >= 1; i--){a.s[i] -= b.s[i];if(a.s[i] < 0) a.s[i+1]--, a.s[i] += base;}while(!a.s[a.len] && a.len > 0) a.len--;return a;
}bool judge(bignum a, bignum b) //这种写法很简略
{if(a.len != b.len) return a.len > b.len;for(int i = a.len; i >= 1; i--)if(a.s[i] != b.s[i]) return a.s[i] > b.s[i];return true;
}bignum operator % (bignum a, bignum b)
{while(judge(a, b)) a = a - b;return a;
}char str[10000 + 5];
void read(bignum& a) //这个输入代码写了好久
{scanf("%s", str);reverse(str, str + strlen(str)); //先翻转在说 int& len = a.len = 0;for(int i = 0, w; i < strlen(str); i++, w *= 10){if(i % 9 == 0) len++, w = 1;a.s[len] += w * (str[i] - '0');}
}void print(bignum a)
{printf("%d", a.s[a.len]);for(int i = a.len - 1; i >= 1; i--)printf("%09d", a.s[i]);puts("");
}int main()
{bignum a, b, c;read(a); read(b);while(b.len) //规定len = 0时值为0 {c = a % b;a = b;b = c;}print(a);return 0;
}