POJ2142 扩展欧几里得

 1 /*
 2 参考别人的代码写的
 3 */
 4 #include <stdio.h>
 5 #include <string.h>
 6 #include <iostream>
 7 #include <math.h>
 8 using namespace std;
 9 int ax,by;
10 int ex_gcd(int a,int b)
11 {
12     if(b==0)
13     {
14         ax=1;
15         by=0;
16         return a;
17     }
18     int gcd=ex_gcd(b,a%b);
19     int temp=ax;
20     ax=by;
21     by=temp-a/b*by;
22     return gcd;
23 }
24 int main()
25 {
26     int a,b,c;
27     while(scanf("%d%d%d",&a,&b,&c)!=EOF)
28     {
29         if(!a&&!b&&!c)
30             break;
31         int flag=0;
32         if(a<b)
33         {
34             swap(a,b);
35             flag=1;
36         }
37         int gcd,x1,x2,y1,y2;
38         gcd=ex_gcd(a,b);
39         ax=ax*c/gcd;
40         by=by*c/gcd;
41         int t=by*gcd/a;
42         int ans=0xfffffff;
43         //int k;
44         for(int i=t-5;i<=t+5;i++)
45         {
46             x2=ax+b/gcd*i;
47             y2=by-a/gcd*i;
48             if(fabs((double)x2)+fabs((double)y2)<ans)
49             {
50                 //k=i;
51                 x1=fabs((double)x2);
52                 y1=fabs((double)y2);
53                 ans=x1+y1;
54             }
55         }
56         //printf("k=%d   t=%d\n",k,t);
57         if(flag)
58             printf("%d %d\n",y1,x1);
59         else
60             printf("%d %d\n",x1,y1);
61     }
62     return 0;
63 }

 

posted on 2013-04-11 10:30  行者1992  阅读(173)  评论(0编辑  收藏  举报