Базовое преобразование для массива дробных мест
Я пытаюсь реализовать алгоритм для преобразования массива целых чисел, которые представляют цифры дробной части числа, из одной базы в другую. Другими словами:
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):
- Сохраняйте перенос, инициализируйте до 0.
- С ПРАВА НА ЛЕВО
а. x = умножить i-ую цифру на baseB и добавить перенос
б. новая i-я цифра равна x % baseA
с. нести = х / baseA- выход [я] = нести
Но когда я это реализую, вторая цифра всегда отключается для массивов, которые длиннее 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;
}