如何为C / C ++编写二进制算法

时间:2009-12-09 09:16:29

标签: c++ c algorithm binary-search

我在用C / C ++编写二进制算法时遇到了麻烦 我的问题是这样的:

应用二进制算法在数字猜谜游戏中搜索1到100之间的数字 用户将以'y'表示正确的猜测,如果猜测太高,则为'h',如果猜测太低,则为'l'。

我不知道应用它。有人可以给我一个代码示例。

3 个答案:

答案 0 :(得分:3)

详细说明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] 

答案 1 :(得分:1)

我认为你的意思是二元搜索。维基百科有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);

所以在你的情况下,min为0,max为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);

但是,如果您需要更多帮助,则需要发布到目前为止的代码。

答案 2 :(得分:0)

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);
 }
}