HDU

来源:互联网 发布:暴走鞋淘宝网 编辑:程序博客网 时间:2024/05/18 23:56

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6209

题目大意:求离sqrt(x)与k/x最近的有理数,分母不超过100000

解题思路:用a/b<=(a+c)/(b+d)<=c/d来不断接近x,用long double才能过

AC代码:

#include<cstdio>#include<cmath>using namespace std;const long double eps = 1e-15;int gcd(int x, int y){    return x%y ? gcd(y, x%y) : y;}long double ffabs(long double x){    if (x < 0) x = -x;    return x;}int judgeZero(long double x){    if (x > eps) return 1;    if (x < -eps) return -1;    return 0;}int main(){    int t;scanf("%d", &t);    while (t--)    {        int k;scanf("%d", &k);        long double x = pow((long double)k, (long double)2 / (long double)3);        int xx = x + eps;        int up1 = xx, down1 = 1, up2 = xx + 1, down2 = 1;        int ansup = up1, ansdown = down1;        while (1)        {            int midup = up1 + up2, middown = down1 + down2;            int g = gcd(midup, middown);            midup /= g, middown /= g;            if (middown > 100000) break;            long double tmp1 = midup, tmp2 = middown, tmp3 = ansup, tmp4 = ansdown;            if (judgeZero(ffabs(tmp1 / tmp2 - x)-ffabs(tmp3 / tmp4 - x))<0)                ansup = midup, ansdown = middown;            if (judgeZero(tmp1 / tmp2 - x) > 0)                up2 = midup, down2 = middown;            else if (judgeZero(tmp1 / tmp2 - x) < 0)                up1 = midup, down1 = middown;            else break;        }        printf("%d/%d\n", ansup, ansdown);    }    return 0;}
原创粉丝点击