Как преобразовать длинное число в базе 10 в базу 9 без преобразования в строку?Код Java для преобразования из Base-10 в Base-9
ответ
FWIW, все значения фактически находятся в базе 2 внутри вашей машины (я уверен, вы уже знали это). Он появляется только в качестве базы 10, потому что преобразование строк создает строковые представления в базе 10 (например, при печати), потому что методы, подобные parseLong
, предполагают, что входная строка находится в базе 10 и потому, что компилятор ожидает, что все литералы будут в базе 10, когда вы на самом деле написать код. Другими словами, все в двоичном виде, компьютер только преобразует материал в и из базы 10 для удобства людей.
Из этого следует, что мы должны с легкостью изменять выходную базу как нечто отличное от 10 и, следовательно, получать строковые представления для одного и того же значения в базе 9. В Java это делается путем передачи необязательного дополнительного базового параметра в метод Long.toString
.
long x=10;
System.out.println(Long.toString(x,9));
Вы не можете преобразовать в базу 9 без преобразования в строку.
Когда вы пишете
Long a = 123;
вы делаете неявное предположение о том, что это в базе 10. Если вы хотите, чтобы интерпретировать, что в качестве основы 9 числа, это нормально, но не существует способа Java (или любой другой язык, о котором я знаю) вдруг увидит его таким образом, и поэтому 8 + 1 вернется 9, а не 10. Там будет поддержка базы 2, 8, 16 и 10, но для любой другой базы вам придется обрабатывать ее как строка. (И тогда, если вы уверены, что хотите это, переведите его обратно в длинный)
Технически вы ** можете ** сделать это без 'string', используя целочисленную арифметику, но трудно понять, почему вы должны. Вы можете пойти в любом случае: перевод с (вычисление 1 * 9^2 + 2 * 9 + 3) или перевод на (создание десятичного числа 148, которое должно интерпретироваться как эквивалент базы-9). Я действительно не понимаю смысла! –
Справедливо, если вы сделаете это вручную :) –
Что означает «конвертировать в базу 9 без преобразования в строку» на самом деле?
Основание-9, основание-10, основание-2 (двоичное), основание-16 (шестнадцатеричное), являются лишь способами представляют номера. Само по себе значение не зависит от того, как вы его представляете. int x = 256
точно такой же, как и для компилятора int x = 0xff
.
Если вы не хотите «конвертировать в строку» (я читал это как означающее, что вас не интересует представление значения), то что вы хотите сделать точно?
Вы должны применить алгоритм, который преобразует число из одной базы в другую, применяя повторяющиеся операции по модулю. Посмотрите 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;
}
M и N - не самые ясные имена переменных! Я предполагаю, что M - это число, которое нужно преобразовать, а N - новая база. Интересно, однако. –
Я просто скопировал программу, которую я нашел на связанном сайте. Действительно, M - это число, которое нужно преобразовать, а N - новая база. –
Я бы не использовал источники с сайта, в котором используется документация с очевидным кодом. – Cephalopod
Если вы БУКВАЛЬНО можете сделать что-нибудь, но преобразовать в строку сделать следующее:
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());
}
числа не имеют основания. Строковое представление числа имеет базу. Когда вы говорите, что у вас есть число в базе 10, вы на самом деле имеете в виду, что у вас есть базовое 10 строковое представление числа. Вопрос - оксюморон. –