RealPhobia

#include<stdio.h>
__int64  extgcd(__int64  a,__int64  b,__int64  &x,__int64  &y)
{
     if(b==0) {x=1;y=0;return a;}
     __int64  d=extgcd(b,a%b,x,y);
     __int64  t=x;x=y;y=t-a/b*y;
     return d;
}
__int64 gcd(__int64 a,__int64 b)
{    return b>0?gcd(b,a%b):a; }
int main()
{
    __int64   t,a,b,x,y,s,x1,y1;
    char c;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d%c%I64d",&a,&c,&b);
        s=gcd(a,b);
        if(s>1) printf("%I64d%c%I64d\n",a/s,c,b/s);
        else
        {
         extgcd(a,b,x,y);
         while(x<0){x+=b;y-=a;}
         x1=x;y1=y;
         while(x1>0) {x1-=b;y1+=a;}
         if(x<0) x=-x;if(y<0) y=-y;
         if(x1<0) x1=-x1;if(y1<0) y1=-y1;
         if(y1==0){ printf("%I64d%c%I64d\n",y,c,x);continue;}
         if(y==0){ printf("%I64d%c%I64d\n",y1,c,x1);continue;}
         if(x>x1){ printf("%I64d%c%I64d\n",y,c,x);continue;}
         if(x<x1){ printf("%I64d%c%I64d\n",y1,c,x1);continue;}
         if(y1>y){ printf("%I64d%c%I64d\n",y,c,x);continue;}
         { printf("%I64d%c%I64d\n",y1,c,x1);continue;}
        }
    }
    return 0;
}

 

/* 题意:已要求找出 一个C/D使得|A/B - C/D|最小,且0<C<D<B,0<A<B。 A,B,C,D 都是整数。

如果GCD(A,B)>1,那么C=A/GCD(A,B),D=B/GCD(A,B),可使|A/B - C/D|=0; 如果 GCD(A,B)=1;上式可化简成|(A*D-B*C)/(B*D)|由于A,B固定所以我们要是D越大,分子越小。 我假设|(A*D-B*C)|=1来做的。(至于为什么是这样子,我只能说感觉是···) 上式我们可以用扩展欧几里德来弄,得出特解,求出通解。 然后把D在范围(0,B)的最大的解输出即可。 因为我们求出的C/D一定是个真分数所以只要D<B,那么一定C<D。 */

 

posted @ 2012-07-10 21:29  zhuiy  阅读(186)  评论(0编辑  收藏  举报