在过去的几天里,我一直试图解决这个问题,但我无法找到解决问题的方法。所以,在这里:
给定基数4(即0,1,2,3作为数字的数字),找到任何负整数或正整数的基数4表示中的多余(-1)。 例子: -6 =( - 1)22 相反,(-1)22超过(-1)的基数4 = 2 * 4 ^ 0 + 2 * 4 ^ 1 +( - 1)* 4 ^ 2 = 2 + 8 - 16 = 10 - 16 = -6在基地10
27 = 2(-1)( - 1) 相反,2(-1)( - 1)=( - 1)* 4 ^ 0 +( - 1)* 4 ^ 1 + 2 * 4 ^ 2 = -1 - 4 + 32 = 27
我确实想出了一些正数的算法,但是没有一个算法适用于所有负数,所以进入垃圾箱就行了。
有人能在这里给我一些线索吗?谢谢!
编辑:我将试图以一种不会引起任何混淆的方式重新解释这个问题。
考虑通过从每个数字中减去1得到的基数,称为基数4的多余 - ( - 1)。在这个基数中,任何数字都可以用数字-1,0,1,2表示。所以,问题要求一个算法,它将任何整数作为输入,并给出该给定数字的表示作为输出。
示例:
十进制-6 = -1 2 2表示基数4的过量 - ( - 1)。
为了验证这一点,我们采用表示-1 -1 2并将其转换为十进制数,从最右边的数字开始并使用通用基数n到基数10算法,如下所示:
number = 2 * 4 ^ 0 + 2 * 4 ^ 1 +( - 1)* 4 ^ 2 = 2 + 4 - 16 = -6
答案 0 :(得分:1)
我不知道“quaterit”是否是这个表示中基数的正确单词,但无论如何我都会使用它。
既然你说你已经有一个正数的算法,我会尝试将负数作为输入并写一些使用你已有的东西。下面的代码不太有用,但我会在最后解释原因。
setBroadcast()
这里的想法是,每个负数int[] BaseFourExcessForNegativeNumbers(int x) {
int powerOfFour = 1;
while (-powerOfFour > x) {
powerOfFour *= 4;
}
int firstQuaterit = -1;
int remainder = x + powerOfFour;
int[] otherQuaterits;
if (remainder >= 0) {
otherQuaterits = BaseFourExcessForPositiveNumbers(remainder);
} else {
otherQuaterits = BaseFourExcessForNegativeNumbers(remainder);
}
int[] result = new int[otherQuaterits.Length + 1];
result[0] = firstQuaterit;
for (int index = 0; index < otherQuaterits.Length; ++index) {
result[index + 1] = otherQuaterits[index];
}
return result;
}
将以此表示形式的x
开头。如果(-1)
位于(-1)
位置,我们希望了解如何代表4^n
以了解如何表示其余数字。
我编写的代码不起作用的原因是它没有考虑第二个quaterit为0的可能性。如果发生这种情况,我的代码将产生的数组将丢失为0.实际上,如果以相同的方式写入x - (-1)*4^n
,则生成的数组将缺少每个 0,否则将是正确的。解决方法是跟踪第一个quaterit占用的位置,然后制作相应大小的数组,并将其从后面填充到前面。