【问题标题】:How to write a binary algorithm for C/C++如何为 C/C++ 编写二进制算法
【发布时间】:2009-12-09 09:16:28
【问题描述】:

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

应用二进制算法在猜数游戏中搜索从 1 到 100 的数字。
用户将回答“y”以表示正确猜测,“h”如果猜测太高,或者“l”如果猜测太低。

我没有任何想法来应用它。谁能给我一个代码示例。

【问题讨论】:

  • 我认为您的意思是分而治之的算法
  • 您遇到问题的哪个方面?
  • 初学者会犯错误,他们不值得一击。我正在+1
  • @benjamin 与错误无关。人们至少应该在寻求帮助之前尝试解决问题。所以 -1
  • 没有关于 SO 的规则规定人们在寻求帮助之前必须尝试解决他们的问题。

标签: c++ c algorithm binary-search


【解决方案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);
       }
      }
      

      【讨论】:

      • 这并不是真正的“二元”搜索,尽管它最终会到达那里
      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 2012-06-25
      • 2011-12-08
      • 1970-01-01
      • 2017-06-05
      • 2012-07-14
      • 2012-10-23
      • 2015-11-29
      相关资源
      最近更新 更多