又有几天没做题了,这几天一直在忙着找工作,希望能快点找到吧。
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);
}
}