在没有IF的情况下返回最大数的算法

时间:2016-10-26 17:09:53

标签: algorithm if-statement return logic restriction

在求职面试中,我的朋友必须解决这个问题:

  

开发一个接收两个变量的算法,a和b都是整数并返回最大值。

     

示例:如果a = 2b = 7算法返回 7

     

限制
   - 你不能使用IF不是比较的任何东西;
   - 还有一个不能使用Math或colections类型库,因为在内部他们使用IF;    - 你不能使用三元运算符,它是一个IF。

这是最后一个问题,在页面底部有以下句子:

Do not look for perfection, just do the best you can.

我们不知道这是暗示还是只是一个动机短语。

没有提及或需要特定的语言,那么我猜可以使用伪代码或是逻辑问题。

以下是几位程序员,没有人设法解决。

5 个答案:

答案 0 :(得分:3)

这是Julia中的一个解决方案,它应该非常清晰,适用于任何64位数据类型。它没有任何控制流或布尔值,只有算术运算和位移。

function f(a,b)
  diff = reinterpret(UInt64,a-b)
  sgn = reinterpret(typeof(a),diff >> 63) #Sign bit of (a-b).
  return (a - sgn*a) + sgn*b
end

答案 1 :(得分:1)

您可以将某些内容存储在临时变量中并尝试以下内容:

解决方案来自: - Find maximum of three number in C without using conditional statement and ternary operator

  

利用布尔表达式中的短路:

int max(int a, int b, int c) {
      int m = a;
      (m < b) && (m = b); //these are not conditional statements.
      (m < c) && (m = c); //these are just boolean expressions.
      return m; } Explanation:
  

在布尔AND操作中,例如x&amp;&amp; y,y被评估当且仅当   x是真的。如果x为假,则不评估y,因为整体   表达式将是错误的,可以在没有评估的情况下推断出来   年。这在布尔值时称为短路   表达式可以在不评估其中的所有操作数的情况下推断出来。

     

将此原则应用于上述代码。最初m是a。现在如果(m <   b)是真的,那意味着,b大于m(实际上是   a),因此评估第二个子表达式(m = b)并将m设置为   湾然而,如果(m      

简而言之,您可以阅读表达式(m&lt; x)&amp;&amp; (m = x)如下:   当且仅当m小于x,即m(x      

测试代码:

 int main() {
         printf("%d\n", max(1,2,3));
         printf("%d\n", max(2,3,1));
         printf("%d\n", max(3,1,2));
         return 0; } Output:
  

3 3 3在线演示:http://www.ideone.com/8045P

     

请注意,max的实现会产生警告,因为已评估   不使用表达式:

     

prog.c:6:警告:未使用计算值prog.c:7:警告:值   不使用计算机为了避免这些(无害)警告,您可以   实现max as:

 int max(int a, int b, int c) {
      int m = a;
      (void)((m < b) && (m = b)); //these are not conditional statements.
      (void)((m < c) && (m = c)); //these are just boolean expressions.
      return m; }
  

诀窍是,现在我们将布尔表达式转换为void,这会导致警告被抑制:

     

http://www.ideone.com/PZ1sP

答案 2 :(得分:1)

(a + b + abs(a-b)) / 2

- 必须接近可接受。当然,abs()可以在没有任何if语句的情况下实现,只需将符号位设置为0。

答案 3 :(得分:0)

由于没有明确说明语言,我们选择X86汇编!

CMP EAX, EBX;   <-- assuming that A is stored in EAX and B is stored in EBX
CMOVL EAX, EBX; <-- no branching required

[编辑:]如果CMP被认为是IF的一部分,我们可以采用第三个寄存器并执行SUB,这绝对不是:

MOV EDX, EAX;
SUB EDX, EBX;
CMOVL EAX, EBX;

答案 4 :(得分:0)

伙计们感谢您的帮助。我有机会检查他们正在寻找的答案 因为它要求一个算法,它不能使用某种编程语言的功能。

答案是: (a+b+|a-b|) * 0,5

正如我之前在同一篇文章中所评论的那样

但是|a-b|abs(a-b)被视为IF,因为他们会测试数字是否为负数。

完整的正确答案必须在不使用IF的情况下实现函数abs(a-b)|a-b|,然后答案将完成。

我已经在搜索绝对值的数学属性和demosntrations来解决这个问题,但是如果你发现只用简单的数学来实现它,那将非常有帮助。

[编辑]如果我这样做:√((a-b)^ 2)。是否需要数学库?