Извиняюсь. Этот вопрос является частью программирования. Нам предлагается внедрить метод, который изменяет долю f от основания A до базы B с P-цифрами точности. Функция имеет подпись
baseChanger(int[] f, int A, int B, int P)
.
Например, десятичная цифра 3.14159 имеет долю 0.14159 и представлена как массив:
int[] frac = {1,4,1,5,9};
Дробь в базе 16 - 0.3BA07 - будет записана
int[] frac = {3,11,10,0,7};
Двоичная фракция 0.01, преобразованная в десятичную дробь, равна 0,25, а проверка функции преобразования будет выглядеть так:
int[] from = {0,1};
int[] to = {2,5};
@Test
assertArrayEquals(to, baseChanger(from, 2, 10, 2));
Это алгоритм, который мы попросили реализовать:
/*
* for (i < P) {
* 1. Keep a carry, initialize to 0.
* 2. From right to left:
* a. x = multiply the ith digit by B and add the carry
* b. the new ith digit is x % A
* c. carry = x / A
* 3. output[i] = carry
*
* @param f The input array to translate. This array is not mutated.
* @param A The base that the input array is expressed in.
* @param B The base to translate into.
* @param P The number of digits of precision the output should
* have.
* @return An array of size P expressing digits in B.
*/
Итак, с "от" и "до", как указано выше, это будет означать следующее:
-
Создайте массив, который может содержать цифры P:
int [] output = new int [P];//output = {0, 0}
-
Возьмите самую правую цифру "от":
{0, 1 < ==}
-
Умножьте эту цифру на B (здесь 10) и добавьте перенос (ноль, в настоящее время) и назначьте x:
x < - 1 x 10 + 0 = 10
-
Замените самую правую цифру (в настоящее время 1) на x mod A (здесь 2):
{0, 0 < ==}
-
Рассчитайте перенос, который равен x/A:
carry < - 10/2 = 5
-
Назначьте перенос в 0-й слот на выходе:
вывод [0] < - перенос
вывод: { 5 < ==, 0}
Эта процедура повторяется еще раз, а вывод теперь
output: {2,5}
Но обратите внимание, что цифры находятся в неправильном порядке и выводятся от наименее значимых до самых значительных!
Кроме того, (что более важно), что было бы сделано для преобразования из десятичной дроби, например 0,3 в двоичную? Предположим, вы хотели, например, 12 цифр точности. Конечно, нет точного двоичного представления, так что бы вы сделали здесь, тем более, что сначала появляются наименее значащие цифры?
from = {3}
Я не знаю, с чего начать, и был бы признателен за некоторые советы. Помните, что эти числа представляют собой дроби, а не целые числа и что алгоритм должен заканчиваться линейным временем.