zju 2678 Bishops on a Toral Board
其实就是求m和n的最大公约数,不过要大数,,可以用Euclid || stein写
#include <stdio.h>
#include <string.h>
char a[101],b[101];
int divide(int l,int ll);
int big(int l,int ll,char a[],char b[]);
void mod(int l,int ll);
char x[101];
int main()
{
int flag,ll,l;
flag=0;
while(scanf("%s %s",a,b)!=EOF)
{
if(flag!=0)printf("\n");
flag=1;
l=strlen(a);
ll=strlen(b);
mod(l,ll);
printf("%s\n",b);
}
return 0;
}
int divide(int l,int ll)
{
int i,t,j,z;
char aa[101],bb[101];
for(i=0;i<l;i++)
{
if(x[i]!='0')break;
}
z=i;
if(z>=l)
{
x[0]='\0';
return 0;
}
for(i=l-1,j=0;i>=z;i--,j++)
aa[j]=x[i];
aa[j]='\0';
for(i=ll-1,j=0;i>=0;i--,j++)
bb[j]=b[i];
bb[j]='\0';
while(l>ll||big(l,ll,aa,bb))
{
t=0;
for(i=0;i<ll;i++)
{
if(t!=0&&aa[i]>'0'){aa[i]=aa[i]-t;t=0;}
else if(t==1){aa[i]='9';t=1;}
if(aa[i]>=bb[i]){aa[i]=aa[i]-bb[i]+'0';}
else if(aa[i]<bb[i]){t++;aa[i]=aa[i]-bb[i]+10+'0';}
}
if(t!=0&&aa[i]>'0')aa[i]-=t;
else while(t!='0'&&aa[i]=='0'){aa[i]='9';t=1;i++;}
for(i=l-1;i>=0;i--)
{
if(aa[i]=='0')l--;
else break;
}
aa[l]='\0';
}
for(i=l-1,j=0;i>=0;i--,j++)
x[j]=aa[i];
x[j]='\0';
return l;
}
int big(int l,int ll,char aa[],char bb[])
{
int i;
if(l<ll)return 0;
else if(l>ll)return 1;
for(i=l-1;i>=0;i--)
{
if(aa[i]>bb[i])return 1;
else if(aa[i]<bb[i])break;
}
if(i<0)return 1;
else return 0;
}
void mod(int l,int ll)
{
int k,flag,i;
char t[101];
while(1)
{
flag=1;
if(l<ll)
{
strcpy(t,a);strcpy(a,b);strcpy(b,t);
i=l;l=ll;ll=i;continue;
}
for(k=0;k<ll;k++)
{
x[k]=a[k];
if(flag==1&&x[k]<b[k]){flag=0;}
else if(flag==1&&x[k]>b[k]){flag=2;}
}
if(flag==0&&ll<l)
{ x[k]=a[k]; k++; }
x[k]='\0';
i=k;
k=divide(k,ll);
while(i<l)
{
x[k]=a[i++];
k++;
x[k]='\0';
k=divide(k,ll);
}
if(k==0)return;
else
{
strcpy(a,b);
strcpy(b,x);
l=ll;
ll=k;
}
}
}
浙公网安备 33010602011771号