如何优雅地解决这个四舍五入的问题?

时间:2014-10-23 23:25:15

标签: 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 = half;
        else if (number > half) start = half;
        else {
            answer = half;
            break;
        }
    }

    if (answer > 0) return 20 - count;
    else return 0;    
}

问题在于,由于现在正在将范围减半的结果四舍五入,它无法猜测数字1,如果我不圆,则无法猜测范围的另一个极端 - 100. / p>

问题的根源很明显,原始黑客解决方案也是如此,但我似乎找不到一种优雅的解决方法。

3 个答案:

答案 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);
    }