2010-10-08 4 views
4

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

+9

числа не имеют основания. Строковое представление числа имеет базу. Когда вы говорите, что у вас есть число в базе 10, вы на самом деле имеете в виду, что у вас есть базовое 10 строковое представление числа. Вопрос - оксюморон. –

ответ

8

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

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

long x=10; 
System.out.println(Long.toString(x,9)); 
6
Long base10 = 10; 
Long.valueOf(base10.toString(), 9); 
+0

На самом деле мне это нужно, не конвертируя его в строку. – Emil

+0

Это домашнее задание? –

+0

Я отредактировал вопрос, чтобы прояснить ситуацию. – Emil

4

Вы не можете преобразовать в базу 9 без преобразования в строку.

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

Long a = 123; 

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

+2

Технически вы ** можете ** сделать это без 'string', используя целочисленную арифметику, но трудно понять, почему вы должны. Вы можете пойти в любом случае: перевод с (вычисление 1 * 9^2 + 2 * 9 + 3) или перевод на (создание десятичного числа 148, которое должно интерпретироваться как эквивалент базы-9). Я действительно не понимаю смысла! –

+0

Справедливо, если вы сделаете это вручную :) –

6

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

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

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

2

Вы должны применить алгоритм, который преобразует число из одной базы в другую, применяя повторяющиеся операции по модулю. Посмотрите here для реализации 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

M и N - не самые ясные имена переменных! Я предполагаю, что M - это число, которое нужно преобразовать, а N - новая база. Интересно, однако. –

+0

Я просто скопировал программу, которую я нашел на связанном сайте. Действительно, M - это число, которое нужно преобразовать, а N - новая база. –

+2

Я бы не использовал источники с сайта, в котором используется документация с очевидным кодом. – Cephalopod

0

Если вы БУКВАЛЬНО можете сделать что-нибудь, но преобразовать в строку сделать следующее:

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()); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^