C++ 如何优雅地解决这个取整问题?

C++ 如何优雅地解决这个取整问题?,c++,rounding,C++,Rounding,我有一个函数,它有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

我有一个函数,它有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;    
}
int猜测(整数){
int start=1;
int-end=100;
整数计数=20;
int-answer=0;
而(计数--){
int half=开始+回合((双回合)(结束-开始)/2);
如果(数量<一半)结束=一半;
否则,如果(数字>一半)开始=一半;
否则{
答案=一半;
打破
}
}
如果(答案>0)返回20-计数;
否则返回0;
}
问题是,由于它现在正在对范围减半的结果进行四舍五入,它无法猜到数字1,如果我不进行四舍五入,它也无法猜到范围的另一个极端-100


这个问题的根源很明显,就像粗糙的黑客解决方案一样,但我似乎找不到一种优雅的方法来解决它。

根据价值所在的方面,使用某种上限和下限

因此,如果您在顶部查找一个值,则使用floor(5.9->5),如果您查找的值低于一半,则使用天花板(90.2=91)


这将使您的流程包括1和100,您知道,这很容易纠正:

检查后,不要将中点保持在可能性范围内,这是不可能的

你为什么会有这些麻烦?因为您使用的是封闭范围,而不是半开放范围,这是明智的

另外,请使用整数算术,如下所示:

    int half = (start + end) / 2;

(整数除法向0舍入)

这是可行的,但在某些情况下可能需要多循环一次。将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("%3d\n", half);
    }
intj;
int启动;
内端;
半整数;
对于(j=1;j<101;j++){
开始=1;
结束=101;
而(1){
一半=(开始+结束)/2;
如果(一半==j)
打破
if(半
我试着在检查之前保留
一半的
一个double,然后将end和start分配给floor或ceil,这很有效,但它确实增加了所有值的尝试次数,因此在我看来,它并不是很优雅。事实上,它增加了很多开销。例如,51在1次尝试中被猜到,26在2次尝试中被猜到,以此类推,但是使用这种方法,相同的数字需要8次尝试。范围内所有数字的总尝试次数从573次增加到700次。@user3735658:尝试一下。记住不要在这些范围内离开中点。无论如何,重新编写,使实际错误及其根本原因显而易见。这是我更喜欢它。