SPOJ 3899. Finding Fractions 连分数

 

连分数乱搞,我反正是一眼没看出结果

某巨巨把这题讲解的比较详细 : http://blog.csdn.net/gogdizzy/article/details/8727386

令k = [a/b] 然后对于a/b < p/q < c/d 就能得到 (a-bk)/b < (p-qk)/q < (c-dk)/d  即 a'/b < p'/q < c'/d ----------------------每项都是<1的

因为显然 a/b < 1 这时如果c/d>1,那么最终结果p = q = 1 也显然的

如果c/d<=1,我们把原不等式倒数一下 ,只需要求 d/c < q/p < b/a  然后就能递归求解满足上式了

因为 d/c < q/p 所以 q > d*p/c  所以 q = q * d / c + 1 

最后因为 p > q * a / b 所以 p = q * a / b + 1 

LL dfs(LL a , LL b , LL c , LL d)
{
    LL k = a/b;
    a = a-b*k; c = c-d*k;
    if(c > d) return 1;
    return d*dfs(d,c,b,a)/c+1;  
}
int main()
{
    //freopen("in.txt","r",stdin);
    LL a,b,c,d;
    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&d))
    {
        LL q = dfs(a,b,c,d);
        printf("%lld/%lld\n\n",a*q/b+1,q);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Felix-F/p/3219663.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值