题目链接:http://www.spoj.com/problems/FINFRAC/
题目大意:给你四个数a,b,c,d让你求最小的q,和对应的最小的p(q最小的情况下),使得a/b<p/q<c/d
题目分析:参考博客:http://blog.csdn.net/gogdizzy/article/details/8727386
设计知识点连分数,简要说下:我们进行分类讨论
(1)a>=b 我们设k为a整除b的值,那么a/b-k<p/q-k<c/d-k ,即(a-bk)/b<(p-qk)/q<(c-dk)/d,然后递归求解
(2)a<b,再次进行分类讨论
<1> c>d 那么p=q=1为我们所求的解
<2> c<=d 那么我们把式子进行翻转去求解d/c<q/p<b/a.
另外,如果我们知道了a,b,q的话,p的最小值应为q*b/a+1
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL find(LL a,LL b,LL c,LL d)
{
if (a>=b)
{
LL k=a/b;
return find(a-k*b,b,c-k*d,d);
}
else
{
if (c>d) return 1;
else return find(d,c,b,a)*d/c+1;
}
}
int main()
{
LL a,b,c,d,p,q;
while (scanf("%lld %lld %lld %lld",&a,&b,&c,&d)==4)
{
q=find(a,b,c,d);
p=q*a/b+1;
printf("%lld/%lld\n",p,q);
}
return 0;
}