Life of xhu

About

HOJ_1491

Apr 05, 2014

  |   #HOJ

又有几天没做题了,这几天一直在忙着找工作,希望能快点找到吧。

1491:这道题很简单,就是分数逼近,题意应该很好理解。

在判断是否更接近的时候,最好把浮点数的比较转换为整数的计算,因为计算机计算浮点数是不精确的。

我按照上面的思路写好代码后,结果在处理示例数据的时候,得到的结果和示例不一样,比如我在17/6后还有20/7,而且经过计算,后者的确比前者更接近37/13,又看了几遍题目,还是没能理解为什么20/7不能作为结果累加,算了,练习的目的已经达到了,就这样吧。

代码如下:

#include <iostream>
#include <cmath>
using namespace std;

void calc(int i1, int i2){
    int init1, init2 = 1, tmp, count = 0;
    if(i1 < (i2 - i1)){
        init1 = 0;
    }
    else{
        tmp = 1;
        while(tmp){
            if(abs((tmp - 1) * i2 - i1) >= abs(tmp * i2 - i1) && abs((tmp + 1) * i2 - i1) >= abs(tmp * i2 - i1)){
                init1 = tmp;
                break;
            }
            tmp++;
        }
    }
    count++;
    cout << "tmp: " << init1 << "   i: " << init2 << endl;
    for(int i = 2; i <= i2; i++){
        tmp = i * i1 / i2;
        if(tmp * i2 < i * i1){
            if(abs((tmp + 1) * i2 - i * i1) < abs(tmp * i2 - i * i1))
                tmp = tmp + 1;
        }else if(tmp * i2 > i * i1){
            if(abs((tmp - 1) * i2 - i * i1) < abs(tmp * i2 - i * i1))
                tmp = tmp - 1;
        }
        if(abs(init1 * i * i2 - init2 * i * i1) > abs(init2 * tmp * i2 - init2 * i * i1)){
            cout << "tmp: " << tmp << "   i: " << i << endl;
            init1 = tmp;
            init2 = i;
            count++;
        }

    }
    cout << count << endl;
}

int main(){
    int n, pk, qk;
    cin >> n;
    while(n--){
        cin >> pk >> qk;
        calc(pk, qk);
    }
}