0

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

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

有一个建议的算法,其措辞如下:

对于(i < 精度 B):

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

    一种。x = 将第 i 位乘以 baseB 并加上进位
    b。新的第 i 个数字是 x % baseA
    c。进位 = x / baseA

  3. 输出[i] = 进位

但是当我实现这个时,对于长于 3 位的数组,第二位总是偏离一点。对于上面的示例,它将返回{1, 3, 6, 2, 5}. 以 2为底的输入{0, 1}将以{2, 5}10 为底正确返回。

我认为我没有正确理解 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;
}

这是来自麻省理工学院的 6.005课程,问题集 1。

4

1 回答 1

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;
}
于 2012-09-23T13:34:34.720 回答