首页 > 解决方案 > 编写一个在c中分割间隔的函数

问题描述

我正在编写一个函数,它应该增加或减少 1 到 100 之间的间隔,具体取决于它采用的参数。

它从 开始(0,100),然后,如果parameter=-1它变成(0,50),如果parameter=1之后,它变成(25, 50)。它存储最后一个“猜测”并基于此给出下一个“猜测”。

我想知道我在什么时候做错了parameter=-1(应该减少间隔的部分)。其他部分工作正常,您不必查看它们,它们给出了预期的输出,但是这个(-1)一个给出25 12 6 3 2而不是25 12 6 3 1.

这是代码:

#include <stdio.h>

int NextGuess(int  param) {

    int num;
    static int a=1, b=99;

    //this part is where it goes wrong (the output doesn't match with the expected one)//
    if (param==-1) //less
    {
        b-=(a+b)/2 - a+1;
        num=(a+b)/2;
    }
    //these below are doing fine//

    if (param==1) //greater
    {
        a+=(a+b)/2 - a+1;
        num=(a+b)/2;
    }

    if (param==0) //equal
    num=(a+b)/2;

    return num;
}
//main isn't important, it's just for testing the output//
int main() {
printf ("%d ", NextGuess(-1));
printf ("%d ", NextGuess(-1));
printf ("%d ", NextGuess(-1));
printf ("%d ", NextGuess(-1));
printf ("%d ", NextGuess(-1));
//output should be: 25 12 6 3 1  but this gives: 25 12 6 3 2    
    return 0;
}

如果有人能指出我在那部分做错了什么,我已经考虑这个简单的事情太久了......

该函数在调用时应该输出的其他示例:

printf ("%d ", NextGuess(1));
printf ("%d ", NextGuess(-1));
printf ("%d ", NextGuess(-1));
printf ("%d ", NextGuess(1));
//output: 75 62 56 59

标签: c

解决方案


让我们做一些数学运算。您可以将数学分解为单独的行,并使用调试器逐步确认。

对于返回猜测值 2 的调用,您的静态数据是a == 1b == 6

所以对于(清理后的)代码

b-=(a+b)/2 - a + 1;
num=(a+b)/2;

我们得到:

`a` + `b` == 7
7 / 2 == 3 (integer math)
3 - 1 + 1 == 3
6 - 3 == 3
num = (1 + 3) / 2 == 2

编辑:这是返回您想要的序列的代码。不过,不能保证我没有破坏你的 +1 序列:)

int NextGuess(int  param) {
    int num;
    static int a=0, b=100;
    static int lastGuess = 50;

    //printf("%d %d %d %d\n", a, b, interval, lastGuess);
    if (param==-1) //less
    {
        b = lastGuess;
    }
    else if (param==1) //greater
    {
        a = lastGuess + 1;
    }

    lastGuess = (a+b) / 2;

    return lastGuess;
}

推荐阅读