Java-код для преобразования из Base-10 в Base-9
Как преобразовать длинное число из базы 10 в базу 9 без преобразования в строку?
6 ответов
FWIW, все значения на самом деле находятся в базе 2 внутри вашей машины (держу пари, вы уже знали это). Он отображается только как база 10, потому что преобразование строк создает строковые представления в базе 10 (например, при печати), потому что такие методы, как parseLong
предполагает, что входная строка находится в базе 10, и потому что компилятор ожидает, что все литералы будут в базе 10, когда вы на самом деле пишете код. Другими словами, все в двоичном формате, компьютер только конвертирует вещи в базу 10 и обратно для удобства нас, людей.
Отсюда следует, что мы должны легко иметь возможность изменить выходную базу на нечто иное, чем 10, и, следовательно, получить строковые представления для того же значения в базе 9. В Java это делается путем передачи необязательного дополнительного базового параметра в Long.toString
метод.
long x=10;
System.out.println(Long.toString(x,9));
Что на самом деле означает "преобразовать в базу 9 без преобразования в строку"?
Base-9, base-10, base-2 (двоичный код), base-16 (шестнадцатеричный код) - это просто способы представления чисел. Само значение не зависит от того, как вы его представляете. int x = 256
точно так же, как int x = 0xff
что касается компилятора.
Если вы не хотите "преобразовывать в строку" (я понимаю, что это означает, что вы не заинтересованы в представлении значения), то что именно вы хотите сделать?
Вы не можете преобразовать в базу 9 без преобразования в строку.
Когда ты пишешь
Long a = 123;
вы делаете неявное предположение, что оно в базе 10. Если вы хотите интерпретировать это как число 9, это хорошо, но нет никакого способа, которым Java (или любой другой язык, который я знаю) вдруг увидит это таким образом и поэтому 8+1 вернет 9, а не 10. Есть встроенная поддержка для баз 2, 8, 16 и 10, но для любой другой базы вы должны будете рассматривать ее как строку. (И затем, если вы уверены, что хотите этого, преобразуйте его обратно в длинный)
Вы должны применить алгоритм, который преобразует число из одной базы в другую, применяя повторяющиеся операции по модулю. Посмотрите здесь для реализации 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;
}
Если вы буквально можете делать что-либо, кроме преобразования в строку, сделайте следующее:
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());
}