Прежде всего, как говорили другие, ваш isPalindrome()
метод работает неправильно.
Я бы посоветовал вам просто преобразовать ваше int в строку, а затем проверить, является ли это палиндромом.Я думаю, что это самый простой способ.Может быть, другие могут прокомментировать, является ли это плохой идеей с точки зрения производительности.
Вот как я бы это сделал:
public static boolean isPalin(int x) {
String s = Integer.toString(x);
for(int i = 0; i < s.length()/2; i++) {
if(s.charAt(i) != s.charAt(s.length()-i-1)) {
return false;
}
}
return true;
}
Кроме того, ваш цикл while работает некорректно, поскольку вы только увеличиваете начало, когда вына самом деле нашел премьер.Счетчик должен увеличиваться каждый раз, когда вы находите простое число.
Кроме того, вы должны основывать условие цикла while на начальном значении, а не на счетчике разрывов строки .
Редактировать:На самом деле вы должны использовать счетчик в то время как условие.Я был неправ.
Вот обновленный код:
public static void main(String[] args) {
int counter = 0;
int start = 2;
while (counter < 50) {
if (isPrime(start) && isPalin(start)) {
System.out.print(start + " ");
counter++;
if (counter % 10 == 0) {
System.out.println();
}
}
start++;
}
}
public static boolean isPalin(int x) {
String s = Integer.toString(x);
for(int i = 0; i < s.length()/2; i++) {
if(s.charAt(i) != s.charAt(s.length()-i-1)) {
return false;
}
}
return true;
}
public static boolean isPrime(int x) {
if (x % 2 == 0 && x != 2) {
return false;
}
int sqr = (int)Math.sqrt(x);
for (int i = 3; i <= sqr; i += 2) {
if(x % i == 0) {
return false;
}
}
return true;
}
Вот выходные данные для первых 50 простых палиндромных:
2 3 5 7 11 101 131 151 181 191
313 353 373 383 727 757 787 797 919 929
10301 10501 10601 11311 11411 12421 12721 12821 13331 13831
13931 14341 14741 15451 15551 16061 16361 16561 16661 17471
17971 18181 18481 19391 19891 19991 30103 30203 30403 30703