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