如何为 C/C++ 编写二进制算法
Posted
技术标签:
【中文标题】如何为 C/C++ 编写二进制算法【英文标题】:How to write a binary algorithm for C/C++ 【发布时间】:2009-12-09 09:16:28 【问题描述】:我在用 C/C++ 编写二进制算法时遇到了麻烦。 我的问题是这样的:
应用二进制算法在猜数游戏中搜索从 1 到 100 的数字。 用户将回答“y”以表示正确猜测,“h”如果猜测太高,或者“l”如果猜测太低。
我没有任何想法来应用它。谁能给我一个代码示例。
【问题讨论】:
我认为您的意思是分而治之的算法 您遇到问题的哪个方面? 初学者会犯错误,他们不值得一击。我正在+1 @benjamin 与错误无关。人们至少应该在寻求帮助之前尝试解决问题。所以 -1 没有关于 SO 的规则规定人们在寻求帮助之前必须尝试解决他们的问题。 【参考方案1】:详细说明here加上各种实现。
int low = 1;
int high = 100;
while (low <= high)
int mid = (low + high) / 2;
char answer = evaluateGuess(mid); //return l, h or y;
if ('y'==answer)
return mid;
if ('l' == answer)
low = mid + 1;
else
high = mid - 1;
// If you get here the human player lied and the answer wasn't in [1..100]
【讨论】:
【参考方案2】:我假设您的意思是二进制搜索。***有loads of information。您也没有指定是否可以使用 stl。
基本伪代码是
min := 1;
max := N; array size: var A : array [1..N] of integer
repeat
mid := (min + max) div 2;
if x > A[mid] then
min := mid + 1
else
max := mid - 1;
until (A[mid] = x) or (min > max);
因此,在您的情况下,最小值为 0,最大值为 100,其中可以将上述算法更改为支持用户输入。所需要做的不是对数组进行比较检查,您只需要检查用户输入。
min := 1;
max := 100;
repeat
mid := (min + max) div 2;
print mid;
c := getChar();
if c == 'h' then
min := mid + 1
else if c == 'l'
max := mid - 1;
else if c == 'y'
return mid
until (min > max);
但是,如果您需要更多帮助,则需要发布到目前为止的代码。
【讨论】:
【参考方案3】:getRandomNumber(lower, upper)
return random number between lower and upper;
main()
lower = 0;
upper = 101;
num = getRandomNumber(lower, upper);
response = askUser(num);
while(response != Y)
if (response==H)
//if secret is higher than num
lower = num;
else
//if secret is lower than num
upper = num;
num = getRandomNumber (lower, upper);
response = askUser(num);
【讨论】:
这并不是真正的“二元”搜索,尽管它最终会到达那里以上是关于如何为 C/C++ 编写二进制算法的主要内容,如果未能解决你的问题,请参考以下文章
用于十六进制的 c/c++ 中的 Aho-Corasick 算法