Отображение палиндромного простого числа - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь создать программу для отображения первых 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;
    }

}

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

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

0 голосов
/ 01 марта 2019

Прежде всего, как говорили другие, ваш 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 
0 голосов
/ 01 марта 2019
  1. Вы не увеличиваете start, когда оно не простое, поэтому вы попадаете в бесконечный цикл, когда нажимаете свое первое не простое число.Поместите ваш start++ вне оператора if.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...