我有这个功能有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. / p>
问题的根源很明显,原始黑客解决方案也是如此,但我似乎找不到一种优雅的解决方法。
答案 0 :(得分:2)
你知道,这很容易纠正:
检查后不要将中点保持在可能范围内,这是不可能的!
你为什么会遇到这些麻烦?因为你正在使用封闭范围而不是半开范围,这是明智的。
顺便说一下,使用整数运算,如下所示:
int half = (start + end) / 2;
(整数除以0)
答案 1 :(得分:0)
使用某种天花板和地板,取决于值所在的一侧。
因此,如果您在顶部查找值,则使用楼层(5.9 - > 5),如果您正在寻找低于该值的值,则使用上限(90.2 = 91)。
这应该使您的流程包括1和100
答案 2 :(得分:0)
这样可行,但在某些情况下可能需要多一个循环。初始化结束为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("%3d\n", half);
}