题目地址:http://www.spoj.com/problems/FINFRAC/
题目大意:
给4个整数a,b,c,d,寻找两个整数p,q,使得a/b < p/q < c/d,需要q是最小的,如果存在多个解,那么找到p是最小的。
连分数解法:
设[a/b]表示a/b向下取整
如果a/b >= 1,设k = [a/b],可以知道 ( a/b ) - k < ( p/q ) - k < ( c/d ) - k,即 (a-bk)/b < (p - qk)/q < ( c- dk) / d,设a' = a - bk,p' = p - qk,c' = c - dk,则求出a'/b < p'/q < c'/d的解以后,p = p' + qk,可以得到真实的p和q。
如果a/b<1
如果c/d>1,那么p = q = 1
如果c/d<=1,那么问题可以转化为d/c < q/p < b/a
欲知详解请猛戳这里
#include <iostream> using namespace std; typedef long long LL; LL find(LL a,LL b,LL c,LL d) { if(a<b) { if(c>d) return 1; else return find(d,c,b,a)*d/c+1; } else { LL k=a/b; return find(a-k*b,b,c-k*d,d); } } int main() { LL a,b,c,d,p,q; while(cin>>a>>b>>c>>d) { q=find(a,b,c,d); p=q*a/b+1; cout<<p<<"/"<<q<<endl; } return 0; }