【51nod】 尋找分數(數學)
阿新 • • 發佈:2019-02-02
基準時間限制: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;
}