1. 程式人生 > >【51nod】 尋找分數(數學)

【51nod】 尋找分數(數學)

基準時間限制:1 秒 空間限制:131072 KB 分值: 160
給出 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<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ull  unsigned long long
#define ll long long
#define ul unsigned int
#define maxn 40000
#define mod 1000000007
using namespace std;
ll p,q;
void solve(ll a,ll b,ll c,ll d)
{
    if
(!a) { p=1;q=d/c+1; return; } if(a>=b) { solve(a%b,b,c-(a/b)*d,d); p+=q*(a/b); return; } if(c>d) { p=1; q=1; return; } solve(d,c,b,a); swap(p,q); } ll a,b,c,d; int main() { int t; cin>>t; while
(t--) { scanf("%lld%lld%lld%lld ",&a,&b,&c,&d); p=q=0; solve(a,b,c,d); printf("%lld/%lld\n",p,q); } return 0; }