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

Największa liczba palindroniczna, będąca iloczynem dwóch liczb 3-cyfrowych
Vendetta
  • Rejestracja: dni
  • Ostatnio: dni
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.

Kopiuj
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.

Kopiuj
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ę.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
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:

Kopiuj
String reverse = (new StringBuilder(""+liczba)).reverse().toString();
if((liczba+"").equals(reverse))
Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Vendetta
  • Rejestracja: dni
  • Ostatnio: dni
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.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Vendetta
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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 :)

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

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

szymczak1503
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.