SPOJ Finding Fractions

제목 주소: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 > = 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 를 얻 을 수 있 습 니 다.
하면, 만약, 만약...
만약 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;
}

좋은 웹페이지 즐겨찾기