c - 编写一个在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
解决方案
让我们做一些数学运算。您可以将数学分解为单独的行,并使用调试器逐步确认。
对于返回猜测值 2 的调用,您的静态数据是a == 1
和b == 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;
}
推荐阅读
- arrays - 如何组合 2 个数组并将元素设置为变量?
- mysql - SQL:将两行合二为一
- matlab - MATLAB:类结构
- mysql - 在同一查询中选择 DISTINCT 和 MAX 并列出附加行中的所有值
- build - 使用 Ninja 构建 UWP 应用?
- ubuntu - 在 Ubuntu 终端中找不到命令错误
- ios - swift textview 和标签在 UITableviewcell 中返回空文本
- php - 试图让参加者在谷歌日历 API/PHP 中设置
- asp.net-mvc - AutoSizeColumns 在带有 DoNetCore.NPOI 的 ASP .NET Core 中无法正常工作
- python - 了解双线性层