Я пытаюсь заставить код печатать палиндромные числа в диапазоне (от 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... (повторяется нужное количество раз, но только одно значение).
Мне кажется, что isReverse устанавливается один раз (в 11), а затем вы продолжаете возвращать это снова и снова, когда вызываете checkNum
Я еще недостаточно квалифицирован, чтобы использовать его
1) Удалите обе статические переменные 2) не используйте int
для переменных с именем isBlah
; 3) @daniu Какой отладчик? Здесь не нужен отладчик. Копаться в этом деле с отладчиком - пустая трата времени.
Вы должны использовать локальные переменные для temp
и isReverse
вместо статических полей.
повторять Сэмюэля: не используйте статические переменные, которые сохраняются при вызовах методов. Просто объявите их в для каждого метода и верните их, чтобы вы знали, что они содержат только значения, относящиеся к этому очень конкретному стеку вызовов.
Использование вашего отладчика действительно поможет вам понять, что происходит с каждой переменной. Пошаговое выполнение подобных вещей с помощью отладчика, когда вы не понимаете, что происходит, НИКОГДА не является пустой тратой времени.
Как и другие, повторенные здесь, вам действительно не нужны статические поля в этом случае. Локальных переменных будет достаточно. Также подумайте, что делает метод 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);
}
}
}
Вы пробовали отлаживать?