如何否定-2号基数?

时间:2015-10-10 17:01:58

标签: java math

我最近接受了Codility测试,我想知道如何否定 -2 base 数字?

例如,数组[1,0,0,1,1]代表基数-2 中的 9

-2 bases:

1,-2,4,-8,16

1 + (-8) + 16 = 9

[1,0,0,1,1]

base -2 中的负9为:

-2 bases:

1,-2,4,-8

1 + (-2) + -8 = -9

[1,1,0,1]

我对这个问题一无所知。必须有一些直观的解决方案。你有任何提示吗?

3 个答案:

答案 0 :(得分:14)

在基数-2中,位置 i 的1表示(-2) i

因此,位置[ i i +1]中的[1,1]表示(-2) i +(-2) I 1 =(-2) I +(-2 )( - 2) I =(1 + -2)( - 2) I = - ( - 2) I

因此,您可以通过将其更改为[1,1]来否定任何[1,0]的出现,反之亦然。

当然,任何其他出现的0都可以保持不变:-0 = 0。

所以在你的例子中,我们将[1,0,0,1,1]分成[{1,0},{0},{1,1}],否定每个部分得到[{1,1} },{0},{1,0}],即[1,1,0,1,0],并删除不必要的高0,产生[1,1,0,1]。

答案 1 :(得分:4)

让我们尝试一些例子:

     (16 -8  4 -2  1)
 1 =   0  0  0  0  1
-1 =   0  0  0  1  1
 2 =   0  0  1  1  0
-2 =   0  0  0  1  0
 3 =   0  0  1  1  1
-3 =   0  1  1  0  1
 4 =   0  0  1  0  0
-4 =   0  1  1  0  0
 5 =   0  0  1  0  1
-5 =   0  1  1  1  1

我们可以尝试以数学方式定义:

给定输入I(b)(其中B是位数),

  1. I =Σ(-2) b I(b) - 碱基的定义-2)
  2. O = -I - 我们正在努力解决的问题
  3. O =-Σ(-2) b I(b) - 取代
  4. O =Σ - ( - 2) b I(b) - 分布
  5. - ( - 2) b =( - 2) b +( - 2) b + 1
  6. O =Σ(( - 2) b +( - 2) b + 1 )I(b) - 替代
  7. O =Σ(( - 2) b I(b)+( - 2) b + 1 I(b)) - 替换
  8. O =Σ(-2) b I(b)+Σ(-2) b + 1 I(b)
  9. O(b)= I(b)+ I(b-1)
  10. 现在,这留下了O(b)为0,1或2的可能性,因为I(b)总是0或1。

    如果O(b)是2,那就是"携带",让我们看几个载体的例子:

           (16 -8  4 -2  1)   (16 -8  4 -2  1)
     1+1 =   0  0  0  0  2  =   0  0  1  1  0
    -2-2 =   0  0  0  2  0  =   0  1  1  0  0
     4+4 =   0  0  2  0  0  =   1  1  0  0  0
    

    对于每个b,从0开始,如果O(b)> = 2,则从O(b)减去2并且增加O(b + 1)和O(b + 2)。这样做直到达到最大值B.

    希望这足以详细解释它。

答案 2 :(得分:0)

假设您有一个数字A,那么-A = A-2 * A 或-A = A +(-2)* A。幸运的是您的基数为-2。 (-2)* A等于左移一位数。现在,您只需要实现A << 1 +A。数组移位很容易。然后,您需要实现一个很小的差别来实现二进制加法:每次进行一点加法运算时,都需要将其乘以-1。

public int[] solution(int[] input)
{
    var A = new int[input.Length + 1];
    var B = new int[input.Length + 1];
    input.CopyTo(B, 1);
    input.CopyTo(A, 0);
    return GetResult(A, B).ToArray();
}

public IEnumerable<int> GetResult(int[] A, int[] B)
{
    var r = 0;
    for (int i = 0; i < A.Length; i++)
    {
        var currentSum = A[i] + B[i] + r;
        r = -currentSum / 2;
        yield return currentSum % 2;
    }
}

对不起,但示例在C#中