Napisałem dobrze działający, ale wydaje mi się że niezbyt dobry kod więc proszę o poradę jak mógłbym go ulepszyć, z góry przepraszam za rozmiar.
Zadanie 2 (20 punktów diament AGH)Liczbę pierwszą będącą palindromem nazywamy “palindromem pierwszym”. Liczbę nazywamy “super palindromem pierwszym” jeżeli podczas odrzucania parami skrajnych cyfr, do końca pozostaje ona palindromem pierwszym. Na przykład, liczba 373929373 jest super-palidromem pierwszym bo 373929373, 7392937, 39293, 929, 2 są palindromami pierwszymi. Początkowymi super palindromami pierwszymi są: 2, 3, 5, 7, 11, 131, 151. Proszę napisać program, który wylicza ile jest super palindromów pierwszych mniejszych od zadanej liczby n.
Wejście: Wpisz jedna liczbę naturalną n.
Wyjście: program powinien wypisać jedną liczbę będącą rozwiązaniem.
Przykład: Dla danych wejściowych: 200 -poprawną odpowiedzią jest: 7.
public class Main {
public static void main(String[] args) {
//wczytanie liczby
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int pal=0;
for(int i=2; i<n; i++) {
pal = zwiekszLiczbePal(i, pal);
}
System.out.println("Liczba super-palindromów to: "+pal);
}
private static int zwiekszLiczbePal(int i, int pal){
int copy = i;
while (czyLp(i) && czyPal(i) && i > 11) {
int dlugosc = dl(i);
i = oddziel(i, dlugosc);
}
if (i <= 11 && czyLp(i) && i!=0) {
//dla sprawdzenia - System.out.println(copy);
return pal+1;
}
return pal;
}
//oddziela indeksy np. 3253 == 25
private static int oddziel(int x, int size){
int[] liczba = new int[size];
int rev=0;
for(int y=0; y<size; y++) {
liczba[y] = x % 10;
x /= 10;
}
for (int i = size-2; i >=1; i--) {
rev = rev * 10 + liczba[i];
}
return rev;
}
//czy liczba pierwsza
private static boolean czyLp(int x){
for(int i=2; i*i<=x; i++){
if(x%i==0)return false;
}
return true;
}
//czy palindrom
private static boolean czyPal(int x){
int copy = x, rev=0;
while(x>0){
rev = rev*10 + x % 10;
x/=10;
}
return rev == copy;
}
//oblicza dlugosc liczby
private static int dl(int x){
int counter=0;
while(x>0){
x/=10;
counter++;
}
return counter;
}
}