我们能否在不使用任何控制结构的情况下从函数返回基于决策的值?

时间:2017-02-15 19:58:15

标签: c++

我的一位大四学生让我解决这个编程难题。

Puzzle ::如果在函数调用上传递5,则创建一个返回9的函数。如果在函数调用时传递9,则返回5,但如果切换三元运算符等,则不使用任何控制结构。 我使用下面提到的代码片段来实现这个难题

#include<iostream>
using namespace std;

int myFunction(int value){
    return value%5;
}

int main(){
    int myArray[5]={9,5,5,5,5};
    cout<<myArray[myFunction(9)]<<endl
        <<myArray[myFunction(5)];
    return 0;
}

建议更有效的方法来解决这个难题

4 个答案:

答案 0 :(得分:4)

解决方案可能是:

unsigned flip59(unsigned x)
{
    return x ^ 12;
}

技巧是按位XOR运算可用于保留或否定基于掩码的位。这里,位置2和3的位被翻转,因此产生5 --> 99 --> 5

x = 5:

5 : 0000 0101
12: 0000 1100
^
9 : 0000 1001

x = 9:

9 : 0000 1001
12: 0000 1100
^
5 : 0000 0101 

答案 1 :(得分:2)

使用XOR操作的属性:

A xor A = 0
0 xor B = B

结合它给予

                 /
                 | A if B == C 
A xor B xor C = <  B if A == C
                 | something else otherwise
                 \

因此利用它可以编写函数

unsigned int foo(unsigned int x)
{
    return x ^ 5 ^ 9;
}

所以这里可以是x == 5,然后它会返回5^5^9=9x == 9,然后它会返回9^5^9=5

答案 2 :(得分:1)

很酷的事情,看看不同的人如何做到这一点。这是我的解决方案。真的很简单。我敢打赌,有更多简单的解决方案!

简而言之:

int function(int i){
  map<int, int> m{{5, 9}, {9, 5}};
  return m[i];
}

或长期逐步版本+测试

#include <iostream>
#include <map>

using namespace std;

int function(int i)
{
  map<int, int> m;
  m.insert({5, 9});
  m.insert({9, 5});

  return m[i];
}

int main()
{
  cout << function(5) << endl;
  cout << function(9) << endl;
}

答案 3 :(得分:0)

使用较小的查找表的原始想法的变体:

int get5or9( int x )
{
    const int lookup[] = { 9, 5 };
    return lookup[ ( x >> 3 ) & 1 ];
}