我的一位大四学生让我解决这个编程难题。
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;
}
建议更有效的方法来解决这个难题
答案 0 :(得分:4)
解决方案可能是:
unsigned flip59(unsigned x)
{
return x ^ 12;
}
技巧是按位XOR运算可用于保留或否定基于掩码的位。这里,位置2和3的位被翻转,因此产生5 --> 9
和9 --> 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=9
或x == 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 ];
}