51 nod 1187 寻找分数

来源:互联网 发布:网络错误769怎么解决 编辑:程序博客网 时间:2024/06/07 03:47

题目

给出 a,b,c,d, 找一个分数p/q,使得a/b < p/q < c/d,并且q最小。例如:1/3同1/2之间,符合条件且分母最小的分数是2/5。(如果q相同,输出p最小的)

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行4个数,a,b,c,d,中间用空格分隔。(1 <= a,b,c,d <= 10^9)

Output

输出共T行,对应符合条件的分数。

Input示例

4
1 3 1 2
2 1 3 1
2 1 4 1
1000 1001 1001 1002

Output示例

2/5
5/2
3/1
2001/2003

分析

这里写图片描述

代码

#include <bits/stdc++.h>int a,b,c,d;long long p,q;void slove(int a,int b,int c,int d){    if (a == 0)    {        q = 1;        p = floor(d / c) + 1;        return;    }    if (a >= b)    {        slove(a % b,b,c - d * (a / b),d);        q += (long long) p * (a / b);        return;    }    if (c > d)    {        p = q = 1;        return;    }    slove(d,c,b,a);    std::swap(p,q);}int main(){    int T;    scanf("%d",&T);    while (T--)    {        scanf("%d%d%d%d",&a,&b,&c,&d);        slove(a,b,c,d);        printf("%lld/%lld\n",q,p);    }}
0 0
原创粉丝点击