Java-код для преобразования из Base-10 в Base-9 - PullRequest
4 голосов
/ 08 октября 2010

Как преобразовать длинное число из базы 10 в базу 9 без преобразования в строку?

Ответы [ 6 ]

8 голосов
/ 08 октября 2010

FWIW, все значения на самом деле находятся в базе 2 внутри вашей машины (держу пари, вы уже это знали). Он отображается только как основание 10, потому что преобразование строк создает строковые представления в базе 10 (например, при печати), потому что такие методы, как parseLong, предполагают, что входная строка находится в базе 10, а компилятор ожидает, что все литералы будут в базе 10, ты на самом деле пишешь код. Другими словами, все в двоичном формате, компьютер только конвертирует данные в базу 10 и обратно для удобства нас, людей.

Отсюда следует, что мы должны легко иметь возможность изменить выходную базу на нечто отличное от 10, и, следовательно, получить строковые представления для того же значения в базе 9. В Java это делается путем передачи необязательного дополнительного базового параметра в Long.toString метод.

long x=10;
System.out.println(Long.toString(x,9));
6 голосов
/ 08 октября 2010

Что на самом деле означает «преобразовать в базу 9 без преобразования в строку»?

База-9, база-10, база-2 (двоичная), база-16 (шестнадцатеричная) - это просто способы представляют числа.Само значение не зависит от того, как вы его представляете.int x = 256 точно так же, как int x = 0xff, что касается компилятора.

Если вы не хотите «преобразовывать в строку» (я читаю это как означающее, что вас не касается представлениестоимости), то что вы хотите сделать именно?

6 голосов
/ 08 октября 2010
Long base10 = 10;
Long.valueOf(base10.toString(), 9);
4 голосов
/ 08 октября 2010

Нельзя преобразовать в базу 9 без преобразования в строку.

Когда вы пишете

Long a = 123;

, вы делаете неявное предположение, что оно в базе 10. Если вы хотитеинтерпретировать это как число 9, это хорошо, но нет никакого способа, которым Java (или любой другой язык, который я знаю) вдруг увидит это таким образом, и поэтому 8 + 1 вернет 9, а не 10. Есть встроенная поддержка для базы2, 8, 16 и 10, но для любой другой базы вам придется рассматривать ее как строку.(И затем, если вы уверены, что хотите этого, преобразуйте его обратно в long)

2 голосов
/ 08 октября 2010

Вы должны применить алгоритм, который преобразует число из одной базы в другую, применяя повторяющиеся операции по модулю.Посмотрите здесь для реализации Java.Я сообщаю здесь код, найденный на этом сайте.Переменная M должна содержать число для преобразования, а N является новой базой.Предостережение: чтобы фрагмент работал правильно, N>=1 && N<=10 должно быть истинным.Расширение с N>10 оставлено для заинтересованного читателя (вы должны использовать буквы вместо цифр).

String Conversion(int M, int N) // return string, accept two integers
{   
    Stack stack = new Stack();  // create a stack
    while (M >= N)  // now the repetitive loop is clearly seen
    {   
        stack.push(M mod N);    // store a digit
        M = M/N;    // find new M
    }   
    // now it's time to collect the digits together 
    String str = new String(""+M);  // create a string with a single digit M
    while (stack.NotEmpty())    
        str = str+stack.pop()   // get from the stack next digit
    return str; 
}
0 голосов
/ 21 апреля 2014

Если вы ВСЕГДА можете делать что-либо, кроме преобразования в строку, сделайте следующее:

public static long toBase(long num, int base) {
    long result;
    StringBuilder buffer = new StringBuilder();
    buffer.append(Long.toString(num, base));
    return Long.parseLong(buffer.toString());
}
...