2015-07-30 4 views
-1

Ниже приведен мой код, который добавляет продукты всех трехзначных чисел в список массивов. Затем печатает те числа, которые являются палиндром. Я получаю 121 в качестве вывода. Почему не другое количество палиндрома?Почему программа ведет себя так?

import java.util.ArrayList; 

public class eular { 
    int reverse=0; 


    public boolean palindrome(Integer num){ 
     int remainder=0; 
     int n=num; 
     while(num!=0){ 
      remainder = num % 10; 
      reverse = reverse * 10 + remainder; 
      num = num/10; 
        } 
     if(n==reverse) 
      return true; 
     else 
     { 
      return false; 
     } 

    } 

    public static void main(String args[]){ 
     eular e=new eular(); 
     ArrayList<Integer> a=new ArrayList<Integer>(); 
    for(int i=100;i<=999;i++) 
     for(int j=100;j<=999;j++){ 

     a.add(i*j); 

     } 
     for (Integer integer : a) { 

    if(e.palindrome(integer)){ 
     System.out.println(integer);; 
    } 

     } 

    } 

    } 
+0

Потому что в вашем ArrayList только 121 является приятелем indrome и, следовательно, значение напечатано ... – CoderNeji

+1

Вы пытались отладить свой код, чтобы узнать, что происходит? Я не downvoter – Jens

+0

Но есть и другие, такие как 9009 и т. Д. Где другие номера? – Ketan

ответ

7

Ваша переменная reverse должна быть инициализирована при каждом вызове метода palindrome. Переместите линию int reverse=0; внутри этого метода.

3

Во-первых, вы забыли объявитьreverse (редактирование: или сделал это в неправильном контексте как поле euler класса: в этом случае вы должны назначить reverse на ноль перед каждым вызовом palindrome):

// static: you don't want "this" 
    public static boolean palindrome(Integer num) { 
    int n = num; 
    int reverse = 0; // <- this was omitted (or misplaced as a field of euler) 

    while (num != 0) { 
     reverse = reverse * 10 + num % 10; 
     num = num/10; 
    } 

    // ifs can be so ugly... 
    return n == reverse; 
    } 

Во-вторых, вы не хотите, чтобы огромные массивы:

... 
    for (int i = 100; i <= 999; i++) 
    for (int j = 100; j <= 999; j++) { 
     int item = i * j; 

     if (palindrome(item)) 
     System.out.println(item); 
    } 
+1

Нет, он не забыл, что он просто объявил его переменной переменной Эйлера, а не локальной переменной в методе. И список 810000 целых чисел не должен быть критическим. Конечно, не требуется, но и не очень критично. –

+0

@Florian Schaetz: в этом случае это правдоподобная причина ошибки: 'reverse' должен быть« назначен нулю »перед каждым вызовом' palindrome' –

+1

Да, это должно быть, но это не означает «просто» добавление обратного, но перемещая его (из класса в метод). Это не было «опущено», но «неправильно». –

Смежные вопросы