我正在尝试实现一种算法来转换一个整数数组,它表示数字的小数部分的数字,从一个基数到另一个基数。换句话说:
int[] input = {0, 0, 1, 0, 1}; // 0.00101 in base 2
int[] output = convertBase(input, 2, 10, 5); // convertBase(input, fromBase, toBase, precision)
output == {1, 5, 6, 2, 5}; // .15625 in base 10
有一种建议的算法,其措辞如下:
for(i< precisionB):
- 保持一个进位,初始化为0。
- 从右到右
一个。 x =将第i个数字乘以baseB并添加进位
湾新的第i位是x%baseA
℃。 carry = x / baseA- output [i] = carry
醇>
但是当我实现这个时,对于长度超过3位的数组,第二个数字总是偏移一点。对于上面的示例,它将返回{1, 3, 6, 2, 5}
。基数2中的{0, 1}
输入将正确返回基数为10的{2, 5}
。
我认为我没有正确理解2b。看起来你已经完成了输入数组中的第i位,替换它应该没关系?
这是我的代码:
public static int[] convertBase(int[] digits, int baseA,
int baseB, int precisionB) {
if (baseA < 2 | baseB < 2 | precisionB < 1) {
return null;
}
int[] input = digits.clone();
int[] output = new int[precisionB];
int carry = 0;
int j;
int x;
for (int i = 1; i <= precisionB; i++) {
j = precisionB - i;
if (input[j] >= baseA | input[j] < 0) {
return null;
}
x = (input[j] * baseB) + carry;
input[j] = x % baseA;
carry = x / baseA;
output[j] = carry;
}
return output;
}
这是MIT's 6.005课程,问题集1。
答案 0 :(得分:0)
我最终弄明白了。解决方案是您必须为输出的每个数字循环输入数组的所有数字。这是Java中的代码:
public static int[] convertBase(int[] digits, int baseA,
int baseB, int precisionB) {
if (baseA < 2 | baseB < 2 | precisionB < 1) {
return null;
}
int[] input = digits.clone();
int[] output = new int[precisionB];
int carry;
int j;
int x;
for (int i = 1; i <= precisionB; i++) {
carry = 0;
for (int k = 0; k < input.length; k++) {
j = input.length - 1 - k;
if (input[j] >= baseA | input[j] < 0) {
return null;
}
x = (input[j] * baseB) + carry;
input[j] = x % baseA;
carry = x / baseA;
}
output[i-1] = carry;
}
return output;
}