C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
C++ question: User think a number 1-100, program asks questions no more than 6 times to get answer. can't get correct
用户必须想到一个从1到100的数字。电脑不断询问不超过6次才能得到什么用户认为数字。我不能把逻辑搞对,我不知道该怎么解决了。请有人帮帮我。
#include "std_lib_facilities.h"
// this program is not correct
// try 24 you will see it
int main()
{
cout << "Think of a number between 1 to 100n";
int max{100};
int min{0};
int answer{0};
string response{"??"};
while ((max - min) != 1)
{
cout << "Is the number < " << (max + min) / 2 << "?n";
cin >> response;
if (response == "y" || response == "yes")
{
max = ((max + min) / 2);
if ((max - min) == 1)
answer = min;
}
else if (response == "n" || response == "no")
{
min = (max + min) / 2;
if ((max - min) == 1)
answer = max;
}
else
{
error("Invalid responsen");
}
}
cout << "The answer is " << answer << endl;
keep_window_open();
return 0;
}
提前谢谢。
正如评论部分已经指出的,您的代码中至少有3个错误:
- 您的问题指出,用户应该想到1到100之间的数字,但变量
min
和max
被初始化为0到100,就好像用户应该想到0到100之间。因此,应该将min
初始化为1
,而不是0
- 当用户回答"是"时;是";对于数字是否低于某个值的问题,可以将
max
设置为该值。这没有意义,因为您知道数字不能是这个值,但必须低于这个值。因此,应该将max
设置为该值减去1 - 当
min == 1
和max == 2
时,程序询问的下一个问题是数字是否为"0"是有意义的<2〃;,以便确定该号码是CCD_ 10还是CCD_。然而,在这种情况下,您的程序会询问该数字是否为"0"<1〃;,这是没有意义的,因为它已经知道这个问题的答案是";否";。因此,与其询问数字是否小于(max + min) / 2
,不如询问数字是否大于(max + min + 1) / 2
我已经清理了您的代码并修复了上面提到的错误。这是代码:
#include <iostream>
#include <string>
constexpr int MIN = 1;
constexpr int MAX = 100;
int main()
{
int min{ MIN };
int max{ MAX };
std::string response;
std::cout << "Think of a number between " << MIN << " and " << MAX << "." << std::endl;
while ( min != max )
{
int guess = (max + min + 1) / 2;
std::cout << "Is the number < " << guess << "? ";
std::cin >> response;
if ( response == "y" || response == "yes" )
{
max = guess - 1;
}
else if ( response == "n" || response == "no" )
{
min = guess;
}
else
{
std::cout << "Invalid response" << std::endl;
}
//The following line only exists for debugging purposes and can be disabled
std::cout << "min: " << min << " max: " << max << std::endl;
}
std::cout << "The number is " << min << "." << std::endl;
return 0;
}
我重新排列了代码,使数字1
和100
只在一个地方硬编码,而不是在程序中的几个地方。这使您可以非常容易地更改范围,而无需更改程序中多个位置的数字。
我的代码没有做的一件事是在6个问题之后停止询问,因为可能需要多达7个问题才能找到正确的答案。在你的问题中,你规定它应该问不超过6次,但没有具体说明如果到那时还没有找到答案会发生什么。
相关文章:
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- cl 生成的可执行文件在第一次运行时运行速度非常慢
- 当我叫了两次时,set_union得到了错误的结果
- 仅当捕获组最后一次出现时,才使字符成为可选字符
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 一个只调用过一次的大函数是否可以内联
- 猜数字:计算机要猜多少次才能得到正确的数字
- 既然其他可滥用但有用的功能已经标准化了,为什么不#pragma一次呢
- 为什么在这个树程序中,我得到了两次输出
- 我在多映射中得到了两次相同的密钥,它只存在于文本文件中
- 当在库中使用fstream时,我在可执行文件中得到链接器错误
- 为什么我得到第一次机会异常,如果没有人调用该函数
- 如果T可以为空,我如何安全地得到(T)的大小
- 对于原始数组和std::vector,明显没有对下标进行过一次结束的说明.这个问题已经得到了决定性的解决吗?
- 链接库两次,可执行文件大小
- 没有得到任何输出.第一次在C++中使用文件流
- 编译器是否在最后一次使用可移动对象时自动使用移动语义?