Как исправить постоянно повторяющуюся цифру 11

Я пытаюсь заставить код печатать палиндромные числа в диапазоне (от 10 до 1000), но он продолжает возвращать 11

 public class Problem{

    static int temp=0;

    static int isReverse; 

    public static int revNum(int d, int n){

        for (int i = 0; i<(Math.log10(d)); i++) {
            temp *= 10;
            temp += n%10;
            n = (n - (n%10))/10;

        }
        return temp;
    }   

    public static int checkNum(int n) {
        if (revNum(n,n) == n) {
            isReverse = n;
        }
        return isReverse;
    }

 public static void main(String[] args) {

        for(int i = 10; i <1000; i++) {
                 System.out.println(checkNum(i));
             }
    }
}

Я ожидаю на выходе 11, 22, 33, 44 и т. д., но на самом деле получается 11, 11, 11... (повторяется нужное количество раз, но только одно значение).

Вы пробовали отлаживать?

daniu 09.04.2019 21:41

Мне кажется, что isReverse устанавливается один раз (в 11), а затем вы продолжаете возвращать это снова и снова, когда вызываете checkNum

Jamie 09.04.2019 21:42

Я еще недостаточно квалифицирован, чтобы использовать его

Seymour 09.04.2019 21:42

1) Удалите обе статические переменные 2) не используйте int для переменных с именем isBlah; 3) @daniu Какой отладчик? Здесь не нужен отладчик. Копаться в этом деле с отладчиком - пустая трата времени.

Andrey Tyukin 09.04.2019 21:43

Вы должны использовать локальные переменные для temp и isReverse вместо статических полей.

Samuel Philipp 09.04.2019 21:43

повторять Сэмюэля: не используйте статические переменные, которые сохраняются при вызовах методов. Просто объявите их в для каждого метода и верните их, чтобы вы знали, что они содержат только значения, относящиеся к этому очень конкретному стеку вызовов.

Mike 'Pomax' Kamermans 09.04.2019 21:49

Использование вашего отладчика действительно поможет вам понять, что происходит с каждой переменной. Пошаговое выполнение подобных вещей с помощью отладчика, когда вы не понимаете, что происходит, НИКОГДА не является пустой тратой времени.

Dawood ibn Kareem 09.04.2019 21:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
7
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как и другие, повторенные здесь, вам действительно не нужны статические поля в этом случае. Локальных переменных будет достаточно. Также подумайте, что делает метод checkNum. Причина, по которой вы всегда видите, что печатается 11, заключается в том, что целое число, возвращаемое из checkNum, равно 11 до тех пор, пока условие в вашем операторе if, revNum(n,n) == n, не вернет true.

Например, когда i = 10, условие revNum(10,10) == 10 вернет false, и, таким образом, isReverse или 0 будет возвращено и напечатано. Когда i = 11, условие revNum(11,11) == 11 вернет true, и, таким образом, isReverse устанавливается равным 11 и распечатывается. Когда i = 12, условие revNum(12,12) == 12 вернет false. И поскольку isReverse в этом случае не изменится, текущее значение этой переменной, 11, возвращается и распечатывается. По мере выполнения цикла будет напечатано 11 экземпляров 11, потому что в следующий раз revNum(n,n) == n вернет true, когда n = 22.

Вместо этого вам следует изменить тип возвращаемого значения checkNum на логический, чтобы определить, когда это условие возвращает значение true. И когда это произойдет, только тогда вы должны напечатать число i в цикле в вашем основном методе, чтобы вы могли видеть, какие числа в диапазоне вашего цикла являются палиндромными.

// these variables are not really necessary
// int temp = 0;
// int isReverse;

public static int revNum(int d, int n){
    int temp = 0;
    for (int i = 0; i<(Math.log10(d)); i++) {
        temp *= 10;
        temp += n%10;
        n = (n - (n%10))/10;
    }
    return temp;
}   

public static boolean checkNum(int n) {
    return revNum(n,n) == n;
}

public static void main(String[] args) {
    for(int i = 10; i <1000; i++) {
         if (checkNum(i)) {
             System.out.println(i);
         }
    }
}

Другие вопросы по теме