您的问题是,您似乎在计算补数时似乎试图求反,这会使您的解决方案变得复杂。
您可以尝试通过将其分为两个阶段来简化解决方案:
- 首先计算补数。
- 第二次将+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