Как System.out.println() может влиять на ответ?
Здравствуйте, знатоки.
Учу Java (17). Создал код, умеющий преобразовывать множество чисел из десятичной системы исчисления в выбранную пользователем:
// Текущая система исчисления.
private static int calculation = 2;
// Список символов до 36-ричной системы исчисления.
private final Map<Integer, String> eu = new HashMap<>();
{
char letter = 'a';
for (int number = 0; number < 10; number++)
eu.put(number, String.valueOf(number));
for (int number = 10; number < 36; number++) {
eu.put(number, String.valueOf(letter));
letter = (char) (letter + 1);
}
}
...
// Получить в необходимой системе исчисления.
private String Calculation(int input, String... answer) {
if (answer.length == 0)
answer = new String[]{""};
boolean flag = input < 0;
if (flag)
input = -input;
if (input >= calculation)
answer[0] = Calculation(input / calculation, answer[0] + eu.get(input % calculation));
else
answer[0] = (new StringBuilder(answer[0] + eu.get(input)).reverse()).toString();
if (flag)
answer[0] = Calculation0(answer[0], input);
return answer[0];
}
// Преобразовать отрицательное число в положительное.
private String Calculation0(String answer, int input) {
StringBuilder a = new StringBuilder();
for (int i = 0; i < answer.length(); i++) {
a.append(eu.get(calculation - 1 - Integer.parseInt(answer.substring(i, i + 1), calculation)));
}
System.out.println(Integer.parseInt(((Pow(input)) ? "" : eu.get(calculation-1)) + a.reverse(), calculation));
return Calculation(Integer.parseInt(((Pow(input)) ? "" : eu.get(calculation-1)) + a.reverse(), calculation) + 1);
}
// Является ли число степенным?
private boolean Pow(int input) {
while (input % calculation == 0)
input = input / calculation;
return input == 1;
}
...
Например, возьмём число являющиеся отрицательным и степенью выбранной двойки:
-4, в 2 системе исчисления получим 100 - верно.
Но если убрать данную строку кода, выдаст ошибочный ответ: 111.
System.out.println(Integer.parseInt(((Pow(input)) ? "" : eu.get(calculation-1)) + a.reverse(), calculation));
Я знаю, что System.out.println() синхронизирован, но пытаясь использовать synchronized на void, не повлияло.
Как понимаю, я нарушил какой-то принцип, но не знаю почему так происходит.
я бы посмотрел на метод reverse(). возможно (я не разбираюсь в java) он меняет текущий объект, а не создает еще один (при каждом вызове переворачивает StringBuilder a)
ну так ты не просто "печатаешь"... ты в ту строку напихал вагон разных вещей...
Привет! Возможно, вам кажется, что строка с System.out.println() влияет на результат, но на самом деле System.out.println() сама по себе не влияет на логику работы вашего кода. Она просто выводит информацию в консоль.
В вашем случае, кажется, что проблема может быть в том, как вы используете рекурсию и манипулируете состоянием переданной в метод переменной answer. Когда вы убираете вызов System.out.println(), возвращаемое значение Calculation0 может быть другим из-за того, что состояние переданного массива answer меняется неожиданно.
Если убрать строку с System.out.println(), это не должно изменить логику вашего кода, если только эта строка не влияет на состояние переменных, используемых в вычислениях. На первый взгляд, в вашем коде много мест, где происходит изменение состояния — добавляются и вычитаются значения, особенно в рекурсивных методах. Именно это изменение состояния и может быть причиной вашей проблемы.
Я бы посоветовал пошагово отслеживать изменения переменных, чтобы выяснить, какие именно действия приводят к неверному результату. Вам нужно убедиться, что манипуляции с рекурсией и изменение состояния переменных выполняются в правильном порядке и в соответствии с вашей бизнес-логикой. Может быть полезным добавить логгирование или использовать отладчик, чтобы отслеживать состояния переменных на каждом шаге выполнения кода.