我需要什么数学来转换这个数字

时间:2010-05-03 20:11:54

标签: math

给定一个X,使用这个表找到它的Y需要什么数学?

x->y
0->1
1->0
2->6
3->5
4->4
5->3
6->2

语言不可知问题

并且不,我不能/不能只存储数组,并进行查找。

是的,输入将始终是0到6的有限集。它不会稍后缩放。

11 个答案:

答案 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