小数位数组的基本转换

时间:2012-09-16 12:51:46

标签: base-conversion

我正在尝试实现一种算法来转换一个整数数组,它表示数字的小数部分的数字,从一个基数到另一个基数。换句话说:

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):

     
    

        
  1. 保持一个进位,初始化为0。
  2.     
  3. 从右到右

             
          

    一个。 x =将第i个数字乘以baseB并添加进位       
    湾新的第i位是x%baseA       
    ℃。 carry = x / baseA

  4.       
  5. output [i] = carry
  6.       

        
  

但是当我实现这个时,对于长度超过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。

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;
}