差 40 ms,急! 已高精压位,部分用了二进制
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct high_precision
{
int len;
int num[10010];
bool operator < (const high_precision b) const
{
if(this->len!=b.len) return this->len<b.len;
for(int i=len;i>=1;i--)
{
if(this->num[i]!=b.num[i]) return this->num[i]<b.num[i];
}
return false;
}
high_precision operator / (int b) //b实际上只是摆设,用 2直接运算即可
{
high_precision a=*this;
for(int i=len;i>=1;i--)
{
a.num[i-1]+=(a.num[i]&1)*100; //b必定为 2;
a.num[i]>>=1;
}
while(a.num[a.len]==0&&a.len>0) a.len--;
return a;
}
high_precision operator * (int b) //同除法
{
high_precision a=*this;
for(int i=1;i<=len;i++) a.num[i]<<=1;
for(int i=1;i<=len;i++)
{
a.num[i+1]+=a.num[i]/100;
a.num[i]%=100;
if(i==a.len&&a.num[i+1]>0) a.len++;
}
return a;
}
high_precision operator - (const high_precision b)
{
high_precision a=*this;
for(int i=1;i<=a.len;i++)
{
if(a.num[i]<b.num[i])
{
a.num[i]+=100;
a.num[i+1]--;
}
a.num[i]-=b.num[i];
}
while(a.num[a.len]==0&&a.len>0) a.len--;
return a;
}
void print()
{
printf("%d",this->num[this->len]);
for(int i=this->len-1;i>=1;i--) printf("%02d",this->num[i]);
if(this->len==0) printf("0");
puts("");
}
}a1,a2;
char s1[10010],s2[10010];
high_precision gcd(high_precision x,high_precision y)
{
high_precision temp;
int cnt=0;
while(y.len)
{
if(!(x.num[1]&1)&&!(y.num[1]&1)) cnt++;
if(!(x.num[1]&1)) x=x/2;
if(!(y.num[1]&1)) y=y/2;
if(x<y) swap(x,y);
temp=x;
x=y;
y=temp-y;
if(x<y) swap(x,y);
}
for(int i=1;i<=cnt;i+=2) x=x*2;
return x;
}
int main()
{
int len1,len2;
scanf("%s%s",s1+1,s2+1);
len1=strlen(s1+1);
len2=strlen(s2+1);
reverse(s1+1,s1+1+len1);
reverse(s2+1,s2+1+len2);
if(len1&1)
{
len1++;
s1[len1]='0';
}
if(len2&1)
{
len2++;
s2[len2]='0';
}
a1.len=len1/2;
a2.len=len2/2;
for(int i=1;i<=len1;i++)
{
a1.num[i+1>>1]=s1[i]-'0';
i++;
a1.num[i>>1]+=(s1[i]-'0')*10;
}
for(int i=1;i<=len2;i++)
{
a2.num[i+1>>1]=s2[i]-'0';
i++;
a2.num[i>>1]+=(s2[i]-'0')*10;
}
high_precision ans=gcd(a1,a2);
ans.print();
return 0;
}