如何优雅地解决这个舍入问题
How to elegantly solve this rounding issue?
我有一个函数,它有20次尝试"猜测"1-100:范围内的数字
int guess(int number) {
int start = 1;
int end = 100;
int count = 20;
int answer = 0;
while (count--) {
int half = start + round((double)(end - start) / 2);
if (number < half) end = half;
else if (number > half) start = half;
else {
answer = half;
break;
}
}
if (answer > 0) return 20 - count;
else return 0;
}
问题是,由于它现在正在对范围减半的结果进行四舍五入,它无法猜测数字1,如果我不进行四舍四入,它也无法猜测范围的另一个极端——100。
问题的根源很明显,就像粗糙的破解解决方案一样,但我似乎没有找到一种优雅的方法来解决它。
你知道,这很容易纠正:
检查后不要将中点保持在可能的范围内,这是不可能的!
你为什么有这些麻烦?因为你使用的是封闭范围,而不是半开放范围,这是明智的。
顺便说一句,使用整数算术,如下所示:
int half = (start + end) / 2;
(整数除法向0取整)
根据值所在的一侧使用某种天花板和地板。
因此,如果你在顶部寻找一个值,那么使用floor(5.9->5),如果你寻找的值低于一半,那么使用limit(90.2=91)。
这应该使您的流程包括1和100
这是有效的,但在某些情况下可能需要再循环一次。将end初始化为101消除了整数除法四舍五入的问题(start也可以设置为0,但不需要)。在执行循环之前,代码也可以只检查1或100,但我不确定这是否会算作另外两个循环。
int j;
int start;
int end;
int half;
for(j = 1; j < 101; j++){
start = 1;
end = 101;
while(1){
half = (start + end)/2;
if(half == j)
break;
if(half < j)
start = half;
else
end = half;
}
printf("%3dn", half);
}
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- 类型转换<int>的舍入问题
- 使用设置精度在C++中舍入小数点时出现问题
- 货币数据的Visual C++舍入问题
- 如何优雅地解决这个舍入问题
- 将浮点转换为无符号短整型时出现舍入问题
- c++双舍入问题
- C++舍入问题