Отображение простого числа-палиндрома

Я пытаюсь создать программу для отображения первых 50 простых палиндромов с 10 числами в строке. Это код, который у меня есть до сих пор, однако при запуске ничего не происходит. Я просмотрел похожие решения и не могу найти, где ошибка. Любая помощь будет оценена по достоинству.

 import java.lang.Math;
public class PalindromicPrime {
    public static void main(String[] args) {
        int counter = 1;
        int start = 2;      

        isPalindrome(start);
        isPrime(start);

        while (counter <= 50) {
            if (isPrime(start) && isPalindrome(start)) {
                System.out.print(start + " ");
                if (counter % 10 == 0) {
                    System.out.println();
                    counter++;
                }
                start++;
            }
        }
    }
    public static boolean isPalindrome(int x) {
        int reverse = 0;
        while(x > 0) {
        reverse = reverse * 10 + x % 10;
        x = x / 10;
        }
        if (reverse == x) {
            return true;
        }
        else {
            return false;
        }       
    }
    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;
    }

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 896
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  1. Вы не увеличиваете start, когда оно не простое, поэтому вы попадаете в бесконечный цикл, когда нажимаете свое первое не простое число. Поместите свой start++ вне оператора if.

  2. Ваш метод isPalindrome() не работает. Переменная x сокращается, чтобы создать reverse, но затем вы сравниваете reverse с модифицированной версией x вместо исходного значения.

  3. Вы только увеличиваете counter каждое 10-е простое число, поэтому в итоге будет напечатано 500 палиндромных простых чисел, а не 50.

Бонус: поиск простых чисел выполняется быстрее, если вы сохраняете каждое найденное простое число, а затем проверяете деление только на ранее найденные простые числа.

Ваш код представляет собой бесконечный цикл. Это связано с тем, что вы увеличиваете start в операторе if, поэтому только тогда, когда start является простым числом и числом-палиндромом. Если start не является палиндромом или простым числом, оно не войдет в условное выражение и, таким образом, counter увеличится в Невере и достигнет 50.

Ответ принят как подходящий

Прежде всего, как уже говорили другие, ваш метод 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 на своем начальном значении, а не на счетчике разрывов строк..
Обновлено: на самом деле вы должны использовать счетчик в состоянии 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 

Другие вопросы по теме