题目描述
Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你决定写一个程序来教训他。
输入输出格式
输入格式:
共两行: 第一行:一个数A。 第二行:一个数B。
输出格式:
一行,表示A和B的最大公约数。
说明
对于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(" "); } }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; }