C编程帮助(计算机猜测用户正在思考的数字)

标签 c

这是我的代码:

#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/

相关文章:

C头文件-划分主要代码

c - 我是否误解了指针引用/取消引用、指针算术或领先的 0's really make a difference in C' 检测相等性的能力?

C while 循环多个条件数学

将毫秒转换为 time_t

c - 使用 SOCK_DGRAM 从服务器获取信息时出现问题

c - 解析传入的数据包

在 C 中调用具有较少参数的函数的后果?

分割数组并计算重复次数的代码

c++ - 优化稀疏矩阵中的对数熵计算

c - scanf 一直被跳过