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());
}
0

Odkąd polecono mi poczytanie o StringBuilder nie zaglądałem na forum, więc doszedłem do rozwiązania jak użyć sam :) Dziękuję za podpowiedź Nozi.

Kod teraz wygląda tak i działa poprawnie:
Wiem, że da się czytelniej, ale działa..

import java.util.*;
public class palindrom {

	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();
			//StringBuilder liczba=new StringBuilder(czyt.next());
		boolean pol=false;
		int ile=0;
		if (Integer.parseInt(liczba)==Integer.parseInt(odtylu(liczba))){pol=true;}
		
		while (pol==false){
			liczba=Integer.toString(cyfra(liczba));
			if (Integer.parseInt(liczba)==Integer.parseInt(odtylu(liczba))){pol=true;}
			ile++;
		}
		System.out.println(liczba+" "+ile );
		
		}//koniec pierwszej pętli

	}

	static String odtylu (String liczba){
        String tylu;
		StringBuilder od=new StringBuilder (liczba);
		od=od.reverse();
		tylu=od.toString();
		
		return tylu;}
	
	static int cyfra(String liczba){
		int cyf=Integer.parseInt(liczba)+Integer.parseInt(odtylu(liczba));
		
		
		return cyf;
	}

	
	
	
}

Dziękuję wszystkim za pomoc, temat do zamknięcia raczej.

0

Przykładowy kod, skoro już masz:

public class PalindromeTest {

	public static final String VALID_PALINDROME = "ala";
	public static final String INVALID_PALINDROME = "al1";

	@Test
	public void shouldBeValidPalindrome() {	
		assertTrue(Palindrome.validate(VALID_PALINDROME));
	}

	@Test
	public void shouldBeInvalidPalindrome() {
		assertFalse(Palindrome.validate(INVALID_PALINDROME));
	}

}
public class Palindrome {

	public static boolean validate(String text) {
		return new StringBuilder(text).reverse().toString().equals(text);
	}
}
0

Pierwszy raz się z tym spotykam, więc nie do końca rozumiem zapis.. Z programowania wiem tyle co z lekcji informatyki i z tego co czytam jako przydatne do rozwiązywania zadań. Wolę korzystać z tego co jest dla mnie jasne.

0

Jeśli chodzi Ci o sposób pisania kodu, to prezentując swój kod na forum (np. ten co zapostowałeś w pierwszym poście) musisz wziąć pod uwagę, że inni ten kod chcą przeczytać, aby Ci pomóc. Ale w niektórych przypadkach tak jak w tym, szybkie spojrzenie na kod sprawia, że nie mam ochoty go czytać, więc spada szansa na rozwiązanie Twojego problemu. Poza tym, więcej czasu spędza się na czytaniu kodu niż na jego pisaniu. Jeśli za miesiąc usiądziesz do swojego programu, spędzisz nad nim o wiele więcej czasu niż w przypadku gdy byłby on napisany zgodnie z jakimiś konwencjami, zasadami dobrego stylu.

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