给定一个X,使用这个表找到它的Y需要什么数学?
x->y
0->1
1->0
2->6
3->5
4->4
5->3
6->2
语言不可知问题
并且不,我不能/不能只存储数组,并进行查找。
是的,输入将始终是0到6的有限集。它不会稍后缩放。
答案 0 :(得分:36)
此:
y = (8 - x) % 7
这就是我的意思:
x 8-x (8-x)%7
----------------
0 8 1
1 7 0
2 6 6
3 5 5
4 4 4
5 3 3
6 2 2
答案 1 :(得分:26)
int f(int x)
{
return x["I@Velcro"] & 7;
}
答案 2 :(得分:23)
0.048611x ^ 6 - 0.9625x ^ 5 + 7.340278x ^ 4 - 26.6875x ^ 3 +(45 + 1/9)x ^ 2 - 25.85x + 1
有时简单的方法是最好的。 ;)
答案 3 :(得分:16)
看起来像:
y = (x * 6 + 1) % 7
答案 4 :(得分:13)
我真的不喜欢%运算符,因为它会进行除法运算:
y = (641921 >> (x*3)) & 7;
但是你说了一些关于不使用查找表的事情,所以这可能不适合你: - )
更新的 既然你想在实际代码中实际使用它并且神秘数字不是很好,我可以提供这个更易维护的变体:
y = (0x2345601 >> (x*4)) & 15;
答案 5 :(得分:6)
虽然似乎已经出现了一堆正确的答案,但我认为我发布这个只是为了展示另一种解决方法(它们基本上都是相同的变体):
嗯,基础模式非常简单:
x y
0 6
1 5
2 4
3 3
4 2
5 1
6 0
y = 6 - x
您的数据恰好将y值“向下”移动了两个指数(或者让x值向上移动“)。
所以你需要一个函数来移动x值。这应该这样做:
x = (x + 5) % 7;
产生的等式:
y = 6 - ((x + 5) % 7);
答案 6 :(得分:4)
结合戴夫和保罗的答案中的想法给出了相当优雅:
y = (8 - x) % 7`
(虽然我看到我被这个打得很厉害)
答案 7 :(得分:2)
unsigned short convertNumber(unsigned short input) {
if (input <= 1) { return !input; } //convert 0 => 1, 1 => 0
return (8-input); //convert 2 => 6 ... 6 => 2
}
答案 8 :(得分:1)
作业?
怎么样:
y = (x <= 1 ? 1 : 8) - x
答案 9 :(得分:1)
并且不,我不能/不能只存储数组,并进行查找。
为什么不呢?
是的,输入将始终是0到6的有限集。它不会稍后缩放。
然后使用一堆条件。
if (input == 0) return 1;
else if (input == 1) return 0;
else if (input == 2) return 6;
...
或者找一个公式,如果它很容易看到一个,它就在这里:
if (input == 0) return 1;
else if (input == 1) return 0;
else return 8 - input;
这是一种避免模数和条件的方法,从这里开始:
y = (8 - x) % 7
我们知道x % y = x - floor(x/y)*y
所以我们可以使用y = 8 - x - floor((8 - x) / 7) * 7
答案 10 :(得分:1)
有点像福?
您只能使用减号,逻辑运算符和班次来获得结果。
b = (x >> 2) | ((x >> 1) & 1)
y = ((b << 3)|(b ^ 1)) - x