hdu 4180

题意; 求接近规定 分数 的 最大分数
用到 farey 数列的第二条性质
1
#include <iostream> 2 #include<stdio.h> 3 using namespace std; 4 /** 5 |a/b-c/d|最小, 同分的|(ad-bc)/bd| 最小,,即求 6 |ax-by| 最小 7 若a,b 有公约数则同分即可。。最小为0 8 若a,b无公约数,即a,b互质,即求ax-by=1或 -ax+by = 1 9 此时需要注意 若a==1 求解释x=1,y=0.。。所以当a=1时需要特殊处理 10 若a!=1 时,,就需要对上面的两个式子ax-by=1或 -ax+by = 1判断,找出最接近的解,即比较分母大的即可 11 12 */ 13 long long ex_gcd(long long a,long long b,long long &x, long long &y){ 14 if(b==0){ 15 x =1; 16 y =0; 17 return a; 18 } 19 long long d = ex_gcd(b,a%b,x,y); 20 long long temp = x; 21 x = y; 22 y = temp - a/b * y; 23 return d ; 24 } 25 26 27 int main() 28 { 29 int t; 30 cin>>t; 31 long long a,b,x,y,gcd,d1,d2,c1,c2; 32 char c; 33 while(t--){ 34 cin>>a>>c>>b; 35 gcd = ex_gcd(a,b,x,y); 36 if(gcd!=1){ 37 cout<<a/gcd<<"/"<<b/gcd<<endl; 38 }else if(a==1){ 39 cout<<1<<"/"<<b-1<<endl; 40 }else{ 41 // d2 = ex_gcd(b,a,y2,x2); 42 d1 = (x+b)%b; 43 d2 = (-x+b)%b; 44 c1 = (-y+a)%a; 45 c2 = (y+a)%a; 46 // cout<<c1<<" "<<c2<<endl; 47 // cout<<d1<<" "<<d2<<endl; 48 if(d1>d2) 49 cout<<c1<<"/"<<d1<<endl; 50 else 51 cout<<c2<<"/"<<d2<<endl; 52 53 54 } 55 } 56 return 0; 57 }

 

posted @ 2014-03-22 16:23  夜晓楼  阅读(267)  评论(0编辑  收藏  举报