Błąd w programie

0

Witam. Tworzę program, który sprawdzi czy dana liczba jest palindromem (czytana od lewej do prawej równa czytanej od prawej do lewej).

Wyświetla mi się błąd:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2284457131"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at polindrom.cyfra(polindrom.java:37)
    at polindrom.main(polindrom.java:17)

Mój kod:

import java.util.*;
public class polindrom {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner czyt=new Scanner (System.in);

        int t=czyt.nextInt();

        for(int i=0;i<t;i++){
            String liczba=czyt.next();
        boolean pol=false;
        int ile=0;
        if (liczba==odtylu(liczba)){pol=true;}

        while (pol==false){
            liczba=Integer.toString(cyfra(liczba));
            if (liczba==odtylu(liczba)){pol=true;}
            i++;
        }
        System.out.println(liczba+" "+ile );

        }//koniec pierwszej pętli

    }

    static String odtylu (String liczba){

        String od ="";
        for (int i=1;i<=liczba.length();i++){
            char rob=liczba.charAt(liczba.length()-i);
            od=od+rob;
        }
        return od;}

    static int cyfra(String liczba){
        int cyf=Integer.parseInt(liczba)+Integer.parseInt(odtylu(liczba));

        return cyf;
    }

}

Wyjaśni mi ktoś gdzie robię błąd? Przygotowuję się powoli do matury i nurtuje mnie to zadanie. Możliwe, że jest jakiś banalny błąd.. Piszę w programie Eclipse.

0

Dostajesz taki błąd ponieważ liczba którą chcesz zamienić na int'a, nie zmieści się w jego zakresie. Zamiast inta, użyj longa

0

Ilość wczytywanych liczb (t) =1
Liczba do sprawdzenia (liczba) = 55 więc mieści się w zakresie.
Program powinien wyświetlić
55 0

0

A ja Ci napisałem, dlaczego dostałeś taki wyjątek. W metodzie cyfra próbowałeś przeparsować "2284457131" na inta, który jest za mały. Jeśli nie rozumiesz dlaczego tak się stało, użyj debugera

0

Tak ma wyglądać kod?

import java.util.*;
public class polindrom {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner czyt=new Scanner (System.in);

        int t=czyt.nextInt();

        for(int i=0;i<t;i++){
            String liczba=czyt.next();
        boolean pol=false;
        int ile=0;
        if (liczba==odtylu(liczba)){pol=true;}

        while (pol==false){
            liczba=Long.toString(cyfra(liczba));
            if (liczba==odtylu(liczba)){pol=true;}
            i++;
        }
        System.out.println(liczba+" "+ile );

        }//koniec pierwszej pętli

    }

    static String odtylu (String liczba){

        String od ="";
        for (int i=1;i<=liczba.length();i++){
            char rob=liczba.charAt(liczba.length()-i);
            od=od+rob;
        }
        return od;}

    static Long cyfra(String liczba){
        Long cyf=Long.parseLong(liczba)+Long.parseLong(odtylu(liczba));

        return cyf;
    }

}

Bo jeżeli tak to dla tych samych danych:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2895767898972780804-"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)
    at polindrom.cyfra(polindrom.java:37)
    at polindrom.main(polindrom.java:17)
1

Jeśli o mnie chodzi, to ten kod jest do wyrzucenia. Następną rzeczą jest to, że to ma być PALINDROM a nie polindrom. Najprostszą metodą sprawdzającą czy coś jest palindromem jest użycie StringBuildera. Zainteresuj się tym.

0

drobna pomyłka w nazwie.. Poszukam i odpowiem czy udało mi się.

1

Podpowiem StringBuilder.reverse(). Jeśli zależy Ci na własnej implementacji, to wystarczy sprawdzać połowę wprowadzonego tekstu.
Poza tym, stosuj się do konwencji nazewnictwa w Javie

0
if (liczba == odtylu(liczba))

W Javie równość stringów się sprawdza za pomocą equals()

Wyjaśnij słowami co ten kod ma robić:

while (pol == false) {
    liczba = Long.toString(cyfra(liczba));
    if (liczba == odtylu(liczba)) {
        pol = true;
    }
    i++;   // uzywaj ++i
}
0

rób to tak:

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuilder(str).reverse().toString());
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0