Как исправить "11" постоянно повторяя - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь заставить код печатать палиндромные числа в диапазоне (от 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 ... (повторяется правильное количество раз, но только одно значение).

1 Ответ

0 голосов
/ 09 апреля 2019

Как и другие, здесь не нужны статические поля в этом случае. Локальных переменных будет достаточно. Также рассмотрим, что делает метод 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 и распечатывается. Когда я = 12, условие revNum(12,12) == 12 вернет ложь. И поскольку 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);
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...