在求职面试中,我的朋友必须解决这个问题:
开发一个接收两个变量的算法,a和b都是整数并返回最大值。
示例:如果
a = 2
和b = 7
算法返回 7 。限制:
- 你不能使用IF不是比较的任何东西;
- 还有一个不能使用Math或colections类型库,因为在内部他们使用IF; - 你不能使用三元运算符,它是一个IF。
这是最后一个问题,在页面底部有以下句子:
Do not look for perfection, just do the best you can.
我们不知道这是暗示还是只是一个动机短语。
没有提及或需要特定的语言,那么我猜可以使用伪代码或是逻辑问题。
以下是几位程序员,没有人设法解决。
答案 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,这会导致警告被抑制:
答案 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)。是否需要数学库?