开始就按扩展阿基里德算法去做,但是错了很多次。。‘
问题出在那个大小的转换。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fabs(int z)
{
if(z >= 0) return z;
else return -z;
}
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
d=a;x=1;y=0;
return ;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
int a,b,d,x,y,cot;
int c,i,j,sum,ant,ans,minn;
while(scanf("%d%d%d",&a,&b,&c)&& a && b && c)
{
minn=99999999;
cot=1;
if(a<b) //就这一步,没了就答案错误
{
cot=0;
swap(a,b);
}
exgcd(a,b,d,x,y);
x=x*(c/d);
y=y*(c/d);
//printf(" %d %d %d\n",x,y,d);
sum=y*d/a;
//printf("%d\n\n",sum);
for(i=sum-10;i<=sum+10;i++)
{
if(fabs(x+b/d*i)+fabs(y-a/d*i) < minn ||(fabs(x+b/d*i)+fabs(y-a/d*i) == minn && a*fabs(x+b/d*i)+b*fabs(y-a/d*i) < ans))
{
ans=a*fabs(x+b/d*i)+b*fabs(y-a/d*i);
minn=fabs(x+b/d*i)+fabs(y-a/d*i);
ant=i;
//printf(" %d %d %d\n",ans,minn,ant);
}
}
if(cot == 1)
printf("%d %d\n",fabs(x+b/d*ant),fabs(y-a/d*ant));
else
printf("%d %d\n",fabs(y-a/d*ant),fabs(x+b/d*ant));
}
return 0;
}
路途中。。。