Top.Mail.Ru
Ответы

Как System.out.println() может влиять на ответ?

Здравствуйте, знатоки.
Учу Java (17). Создал код, умеющий преобразовывать множество чисел из десятичной системы исчисления в выбранную пользователем:

123456789101112131415161718192021222324252627282930313233343536373839404142434445
 // Текущая система исчисления. 
    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.

1
 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(), это не должно изменить логику вашего кода, если только эта строка не влияет на состояние переменных, используемых в вычислениях. На первый взгляд, в вашем коде много мест, где происходит изменение состояния — добавляются и вычитаются значения, особенно в рекурсивных методах. Именно это изменение состояния и может быть причиной вашей проблемы.
Я бы посоветовал пошагово отслеживать изменения переменных, чтобы выяснить, какие именно действия приводят к неверному результату. Вам нужно убедиться, что манипуляции с рекурсией и изменение состояния переменных выполняются в правильном порядке и в соответствии с вашей бизнес-логикой. Может быть полезным добавить логгирование или использовать отладчик, чтобы отслеживать состояния переменных на каждом шаге выполнения кода.