这是我的代码:
#include <stdio.h>
#include <strlib.h>
main()
{
int n = 50;
int m;
char answer[100];
printf("Think of a number in the range of 1-%d and I'll guess it.\n",n);
m = n/2 ;
while( m>1 )
{
printf("Is the number %d?", m);
scanf("%s",answer);
if (strcmp(answer,"no")==0)
{
//i = n/2;
printf("Is the number less than %d?",m);
scanf("%s",answer);
if(strcmp(answer,"no")==0)
{
m = m + (n - m)/2;
}
else if(strcmp(answer,"yes")==0)
{
m = m/2;
}
}
else if(strcmp(answer,"yes")==0)
{
printf("I have have succeeded in guessing your number. %d\n",m);
break;
}
}
}
<小时/>
“m = m/2;”中似乎存在某种问题。代码。我不知道它是什么。有谁知道问题是什么?我尝试了多种方法。我似乎无法弄清楚。
最佳答案
根据您所写的内容,我可以推断您正在尝试根据是或否响应将搜索空间分成两半。我看到的问题是你的搜索范围的下限根本没有改变,你的上限却改变了,下一个搜索键(m)并不是真正的中点,而是其他东西(m = m +(n - m)/2) 导致您遇到的行为
m = 25 [ number is > 25 ] [ search-range = (0,37) ]
m = 37 [ number is > 37 ] [ search-range = (0,43) ]
m = 21 [ number is < 21 ] [ search-range = (0,10) ]
..
在上面的例子中,此时我们知道我们走错了方向!
逻辑需要在每个阶段调整下限和上限,从而缩小搜索范围,并且搜索关键字始终是该范围的中点。如果猜测的数字小于中点,则上限变为中点-1,如果大于中点,则下界变为中点+1,否则匹配。 (此外,如果下限变得大于上限,那么您正在搜索的任何内容都不在原始范围内)。本质上这是一个二分搜索。
以下示例说明了在您所举的示例中每次失败匹配后如何调整搜索范围
25 [ number is > 25 ] [ change lower-bound search-range = (26,50) ]
38 [ number is > 38 ] [ change lower-bound search-range = (39,50) ]
44 [ number is < 44 ] [ change upper-bound search-range = (39-43) ]
41 [ number is < 41 ] [ change upper-bound search-range = (39-40) ]
39 <<< you have a match
关于C编程帮助(计算机猜测用户正在思考的数字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356979/