Базовое преобразование для массива дробных мест

Я пытаюсь реализовать алгоритм для преобразования массива целых чисел, которые представляют цифры дробной части числа, из одной базы в другую. Другими словами:

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

Есть предложенный алгоритм, который сформулирован так:

для (я <точность B):

  1. Сохраняйте перенос, инициализируйте до 0.
  2. С ПРАВА НА ЛЕВО

    а. x = умножить i-ую цифру на baseB и добавить перенос
    б. новая i-я цифра равна x % baseA
    с. нести = х / baseA

  3. выход [я] = нести

Но когда я это реализую, вторая цифра всегда отключается для массивов, которые длиннее 3 цифр. Для приведенного выше примера, он вернет {1, 3, 6, 2, 5}, Ввод {0, 1} в базе 2 правильно вернется {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;
}

Это из курса MIT 6.005, проблема 1.

1 ответ

Решение

В конце концов я понял это. Решение состоит в том, что вы должны зациклить все цифры входного массива для каждой цифры выходного. Вот код на 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;
}
Другие вопросы по тегам