我需要帮助设计Java代码,以通过以下方式为任何给定的整数生成位数组:
23
的输出应为1101011
(最小长度数组)
说明:
位置以1 -2 4 -8 16 -32 ....
因此1101011
可以被评估为:
1*1 + 1*-2 + 0*4+ 1*-8 + 0*16 +1*-32 + 1*64 = 23
答案 0 :(得分:5)
这是数字的 nebinbinary 表示形式(最早由VittorioGrünwald于1885年描述)。可以用与通常的二进制表示形式非常相似的方式对它们进行编码,只需将-2而不是2作为基础即可使用(受https://en.wikipedia.org/wiki/Negative_base上C#代码启发的Java代码):
class EncodeNegaBinary {
public static void main(String[] args) {
int n=0,input=0;
String result="";
final String[] BITS = { "0","1" };
if (args.length != 1) {
System.err.println("Please enter an integer to be converted");
return;
} else {
input = n = Integer.parseInt(args[0]);
}
while (n != 0) {
int r = n%-2;
n /= -2;
if (r == -1) {
r=1;
n++;
}
result = BITS[r] + result;
}
System.out.printf( "%d -> %s\n", input, result);
}
}
答案 1 :(得分:1)
由于通常不会进行int到二进制的转换,因此在每个步骤中我们都需要考虑两种情况,因为在每个位置只能有两个选择0或1。这是在以下程序中递归完成的:
public class ModifiedIntToBinaryConversion{
public static int calcBinaryString(int reqSum, int currSum, int add, String bs) {
if (reqSum == currSum) { // base condtion 1
System.out.println("The string is \n" + bs);
return currSum;
}
if (add + currSum > reqSum) { // base condtion 2
return 0;
}
int newAdd = add * -2;
// System.out.println("new add is "+ newAdd +" currSum is "+ currSum);
int s1 = calcBinaryString(reqSum, currSum + add, newAdd, bs + "1");
if (s1 == reqSum)
return s1;
int s2 = calcBinaryString(reqSum, currSum, newAdd, bs + "0");
return s2;
}
public static void calcBinaryString(int sum) {
int s1 = calcBinaryString(sum, 0, 1, "");
if(s1 != sum) {
System.out.println("The binary equivalent couldn't be found");
}
}
public static void main(String[] args) {
calcBinaryString(23);
}
}
现在基本条件1很清楚,因为我只是在检查所需的总和与计算的总和是否相等。
对于基本条件2,我将接受它的调试结果,并在遇到Stackoverflow错误时稍加思考。一旦计算出的总和变得比所需的总和大,然后我们取下一个-ve数,以使其小于req。和。但是,下一个+ ve数将大于我们刚刚考虑的-ve数,因此,计算出的总和等于req的机会非常小。总和。