Największa liczba palindroniczna, będąca iloczynem dwóch liczb 3-cyfrowych

0

Mam zadanko, w którym muszę znaleźć największą liczbę palindroniczną, która jest iloczynem 2 liczb 3-cyfrowych.
Liczby palindromiczne to takie, które są identyczne niezależnie czy czytamy je od przodu czy od tyłu. Np. 12321.
Napisałem program i wydaje się mi, że działa prawidłowo.

public class ProjectEuler4 {
	public static void main (String[] args) {
		for (int i = 999; i > 100; i--) {
			for (int j = 999; j > 100; j--) {
				int liczba = i *j;
				String ciag = Integer.toString(liczba);
				int dlugosc = ciag.length();
				if (dlugosc == 6) {
					if (ciag.charAt(0) == ciag.charAt(5)
					& ciag.charAt(1) == ciag.charAt(4)
					& ciag.charAt(2) == ciag.charAt(3))
						System.out.println(liczba);
				}
				else {
					if (ciag.charAt(0) == ciag.charAt(4)
					& ciag.charAt(1) == ciag.charAt(3))
						System.out.println(liczba);
				}
			}
		}
	}
}

Wynik (pierwsze 10 pozycji):

580085
514415
906609
119911
282282
141141
853358
650056
601106
592295

Widać od razu, że w ten sposób nie znajde największej liczby. Muszę najpierw posortować wyniki.
I tak zrobiłem, przerobiłem program aby wyniki się posortowały i na pierwszej pozycji była liczba największa czyli 906609.

import java.util.*;
public class ProjectEuler4 {
	public static void main (String[] args) {
		int[] tablica  = new int[100000];
		int licznik = 0;
		for (int i = 999; i > 100; i--) {
			for (int j = 999; j > 100; j--) {
				int liczba = i *j;
				String ciag = Integer.toString(liczba);
				int dlugosc = ciag.length();
				if (dlugosc == 6) {
					if (ciag.charAt(0) == ciag.charAt(5)
						& ciag.charAt(1) == ciag.charAt(4)
						& ciag.charAt(2) == ciag.charAt(3))
							//System.out.println(liczba);
							tablica[licznik] = liczba;
				}
				else {
					if (ciag.charAt(0) == ciag.charAt(4)
						& ciag.charAt(1) == ciag.charAt(3))
							//System.out.println(liczba);
							tablica[licznik] = liczba;
				}
				licznik++;	
			}
		}
		Arrays.sort(tablica);
		for (int i = 0; i < tablica.length; i++) {
			System.out.println(tablica[i]);
		}
	}
}

No i w tym momencie już program się posypał, dopiero jak dam tablice o wielkości 1mln to nie pojawia się błąd o jej przepełnieniu. Wynik natomiast wygląda tak, że jakieś 80% wyświetlanych liczb na początku to 0, a dalej są to faktycznie liczby palindromiczne, ale wyświetlane podwójnie:

886688
886688
888888
888888
906609
906609

Pomijając fakt, że mielił to z dobre pół minuty :)

Wiem, że często moje programy są tak "wymoczone", że można to zrobić 1000 razy prościej (wierzę jednak, że w końcu się wyrobię ćwiczeniami i zmieni mi się nieco tok myślenia przy programowaniu) :)
A więc jakby to lepiej zrobić według Was?
W jaki sposób posortować tablicę, ale malejąco a nie rosnąco?
Czy jest możliwość nadania dynamicznej wielkości dla tablicy? Wyliczając takie liczby nie mam pojęcia ile ich będzie, więc nie wiem też jaką dać tablicę.

0

Nie korzystaj z tablic tylko z kolekcji, np. ArrayList. Kryterium sortowania nie ma znaczenia, największa liczba będzie albo na początku albo na końcu.
Przykładowy kod:

ArrayList<Integer> palindromy = new ArrayList<Integer>();
...
if(liczba jest palindromem oraz !palindromy.contains(liczba))
{
    palindromy.add(liczba);
} 
....
Collections.sort(palindromy);

Krótszy (i dużo bardziej uniwersalny) kod sprawdzający czy liczba jest palindromem wygląda tak:

String reverse = (new StringBuilder(""+liczba)).reverse().toString();
if((liczba+"").equals(reverse))
0

a po co tablice, jak wystarczy bieżące maksimum?
http://ideone.com/HbwCI

0

No to fakt. Mogłem zrobić to na ArrayList, tym bardziej, że już ją przerabiałem wcześniej. A ten pomysł z bieżącym maksimum też niezły.

Dzięki chłopaki za porady. Spróbuję na podstawie tego napisać taki program, żeby od razu wyświetlał mi tylko tą jedną liczbę, bo to chyba będzie najbliższe treści zadania, wcześniej o tym nie pomyślałem i temu jakieś kombinacje z tablicami próbowałem.

0

inny sposób to przeszukiwanie palindromów, czy dają się zfaktoryzować: http://ideone.com/tsvJs

0

Ja poprawiłem swój program w ten sposób:

public class ProjectEuler4 {
	public static void main (String[] args) {
		int najwieksza = 0;
		for (int i = 999; i > 100; i--) {
			for (int j = 999; j > 100; j--) {
				int liczba = i *j;
				String ciag = Integer.toString(liczba);
				int dlugosc = ciag.length();
				if (dlugosc == 6) {
					if (ciag.charAt(0) == ciag.charAt(5)
						& ciag.charAt(1) == ciag.charAt(4)
						& ciag.charAt(2) == ciag.charAt(3))
							if (liczba > najwieksza)
								najwieksza = liczba;
				}
				else {
					if (ciag.charAt(0) == ciag.charAt(4)
						& ciag.charAt(1) == ciag.charAt(3))
							if (liczba > najwieksza)
								najwieksza = liczba;
				}
			}
		}
		System.out.print(najwieksza);
	}
}

Jak na razie taki mi wystarczy. Dziękuję wszystkim za zainteresowanie :)

0

druga pętla do d**y, drugi raz liczysz to samo.

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