基本否定给出inDigits

我有以下问题: 给定以base为单位的输入(输入以该base的数字数组的形式给出),在outDigits中以“ base's”的补码表示形式写负数。
数字的“基数补码”表示法是“二进制补数”的概括:如果我们将(-x)作为基数中的无符号数并将其加到x,则应该得到0(模数基数^位数)。 我无法调用其他功能(甚至是Math.pow)
我的测试不断出现错误。我的代码:

public static void baseNegate(int base,int[] inDigits,int[] outDigits) {
        outDigits[0] = 1;
        for (int i = outDigits.length - 1; i >= 0; i--) {
            outDigits[i] += base - (1 + inDigits[i]);
            if (i < outDigits.length - 1) {
                outDigits[i + 1] = outDigits[i] / base;
            }
            outDigits[i] %= base;
        }
    }

我在计算中找不到错误,请帮忙。 我的测试:


------------------------------------ Negate number 365 in base 10 ------------------------------------
Test case have FAILED.
Base:    10
Input number:    [5,6,3]
Expected:        [5,3,6]
Output:          [5,0]

-------------------------------- Negate number b1010110011 in base 2 --------------------------------
Test case have FAILED.
Base:    2
Input number:    [1,1,1]
Expected:        [1,0]
Output:          [1,0]

-------------------------------------- Negate 0x7AF0 in base 16 --------------------------------------
Test case have FAILED.
Base:    16
Input number:    [0,15,10,7]
Expected:        [0,5,8]
Output:          [0,0]
yangwei521 回答:基本否定给出inDigits

您的问题是,您似乎在计算补数时似乎试图求反,这会使您的解决方案变得复杂。

您可以尝试通过将其分为两个阶段来简化解决方案:

  • 首先计算补数。
  • 第二次将+1添加到计算出的补码中。

以下方法是该方法的有效版本:

    public static void baseNegate(int base,int[] inDigits,int[] outDigits) {
        // Compute the complement of the digits
        for (int i = outDigits.length - 1; i >= 0; i--)  
            outDigits[i] = base - (1 + inDigits[i]);

        // Negate the complement by adding +1 to the computed number (collection of digits)
        for (int i = 0; i < outDigits.length; i++) {  
            if (outDigits[i] == base - 1) {
                // Max out digit. Set it to zero and try with the higher order next. 
                outDigits[i] = 0;
            } else {
                // Digit that has room for +1. Finally add the 1 and DONE!
                outDigits[i]++;
                break;
            }
        }
    }

这种方法更清晰,性能更好,并且代码易于说明;但是我在代码中添加了注释,以遵循所使用的逻辑。

Complete code on GitHub

希望这会有所帮助。

,

由于“预期”值表明索引0是最低顺序数字,因此对于数字<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="row p-3 mb-4 keywords-list language-list"> <span class="keyword"> <span class="keyword-remove " ></span> <span class="keyword-text b p-2 text-black">English</span> </span> <span class="keyword"> <span class="keyword-remove " ></span> <span class="keyword-text b p-2 text-black">Hindi</span> </span> <span class="keyword"> <span class="keyword-remove " ></span> <span class="keyword-text b p-2 text-black">ABCD</span> </span> <span class="keyword"> <span class="keyword-remove " ></span> <span class="keyword-text b p-2 text-black">Laravel</span> </span> <span class="keyword"> <span class="keyword-remove " ></span> <span class="keyword-text b p-2 text-black">kannada</span> </span> </div>,该数组将为123₁₀,即,这些数字与您所输入的数字相反。 d期望作为人类。对于计算机而言,索引[3,2,1]的值是必须乘以i的值才有意义。

这意味着您需要baseⁱ循环来迭代而不是向下迭代,以便可以跟踪结转。否则,您的代码可以正常工作:

i

就个人而言,这样写更有意义,尤其是因为它不依赖于public static void baseNegate(int base,int[] outDigits) { outDigits[0] = 1; for (int i = 0; i < outDigits.length; i++) { // <== reversed iteration outDigits[i] += base - (1 + inDigits[i]); if (i < outDigits.length - 1) { outDigits[i + 1] = outDigits[i] / base; } outDigits[i] %= base; } } 数组来预先初始化为全0:

outDigits

为了获得更好的性能,您不想使用public static void baseNegate(int base,int[] outDigits) { int carry = 0; for (int i = 0; i < outDigits.length; i++) { outDigits[i] = (base - inDigits[i] - carry) % base; carry = (inDigits[i] + outDigits[i] + carry) / base; } } %,所以这样可能会更好:

/

测试

所有3个结果相同:

public static void baseNegate(int base,int[] outDigits) {
    boolean carry = false;
    for (int i = 0; i < outDigits.length; i++) {
        if (carry) {
            outDigits[i] = base - inDigits[i] - 1;
        } else if (inDigits[i] != 0) {
            outDigits[i] = base - inDigits[i];
            carry = true;
        }
    }
}

输出

public static void main(String[] args) {
    test(10,5,6,3);
    test(2,1,1);
    test(16,15,10,7);
    test(8,0); // 0 -> 0 (000)
    test(8,0); // 1 -> -1 (777)
    test(8,7,3); // 255 -> -255 (104)
    test(8,4); // -256 -> -256 (004)
}

static void test(int base,int... inDigits) {
    int[] outDigits = new int[inDigits.length];
    baseNegate(base,inDigits,outDigits);
    System.out.printf("%d: %s -> %s%n",base,Arrays.toString(inDigits),Arrays.toString(outDigits));
}
,

我认为这是一个问题:

if (i < outDigits.length - 1) {
    outDigits[i + 1] = outDigits[i] / base;
}

假设您使用的是以10为底的数字。由于数字只能是0到9,所以除以10意味着该计算结果始终为0。我认为您不是故意这样做的。

本文链接:https://www.f2er.com/3017577.html

大家都在问