Java ArrayIndexOutOfBoundsException палиндромные простые числа

#java #exception

#java #исключение

Вопрос:

Я работал над этим кодом для класса, которому необходимо найти желаемое количество простых чисел палиндромных чисел. Все работает нормально, когда у меня есть while(primeCounter < желаемое число простых чисел), за исключением того, что он выводит на единицу меньше желаемого числа простых чисел. Я пытаюсь исправить это, указав вместо оператора while значение «<=», но затем я получаю исключение индекса массива вне границ. Как вы можете видеть, я даже проверяю, чтобы убедиться, что индекс массива не меньше индекса, который я пытаюсь использовать в операторе if

Любая помощь приветствуется.

 import java.util.Scanner;

public class PalPrimes
{
    public static void main(String [] args){

        Scanner scan = new Scanner(System.in);

        int primeCounter=1, numberToCheck=2; //start checking at 2 because primes >1

        System.out.println("Please enter the desired number of palindromic primes");

        int desiredNumPrimes = scan.nextInt();

        int[] palPrimes = new int[desiredNumPrimes-1];
        System.out.print(palPrimes.length);

        //find palindromic primes
        while(primeCounter<desiredNumPrimes){
            if(isPrime(numberToCheck)==true amp;amp; isPalindrome(numberToCheck)==true){

                    palPrimes[primeCounter-1]= numberToCheck;

                numberToCheck  ;
                primeCounter  ;
            }
            else{
                numberToCheck  ;
            }

        }

        //display palindromic primes
        if(primeCounter==desiredNumPrimes){
            for(int i = 0; i<palPrimes.length; i  ){
                if(i%10==0){
                    System.out.println();
                }

                System.out.print(palPrimes[i]   " ");
            }
        }
    }

    //Check if number is a prime    
        public static boolean isPrime(int num){
        if(num == 2){
            return true;
        }

        for( int divisor = 2; divisor <= num/2; divisor  ){
            if (num % divisor ==0){
                return false;
            }
        }

        return true;

    }

    //reverse number to begin testing if palindrome
    public static int reverse(int num){
        int testNum = 0;

        while(num !=0){
            int lastDigit = num%10;
            testNum = testNum*10 lastDigit;
            num = num/10;
        }

        return testNum;
    }

    //Check if number is a palindrome
    public static boolean isPalindrome( int num){

        return num == reverse(num);
    }
}
  

Комментарии:

1. Спасибо вам обоим. Моя логика в выборе запуска простого счетчика с 1, потому что я начинал свой номер для проверки с 2 (который является простым числом) Я думаю, это то, что мешало мне увидеть это.

Ответ №1:

Проблемы связаны с инициализациями. Следующие 3 изменения устранят проблему. Вы получаете arrayindexoutofbounds, поскольку пытаетесь изменить только инициализацию, но не назначение

     int primeCounter with 0
    int[] palPrimes = new int[desiredNumPrimes];
    palPrimes[primeCounter]= numberToCheck;
  

Ответ №2:

Запустите счетчик простых чисел с 0, поскольку вы еще не нашли ни одного простого числа.

 int primeCounter=0, numberToCheck=2;
  

Вы делаете размер palPrimes 1 меньше желаемого количества простых чисел, поэтому он никогда не сможет содержать желаемое количество простых чисел. Вместо этого сделайте это

 int[] palPrimes = new int[desiredNumPrimes];
  

Затем вы проверяете наличие palPrimes[primeCounter-1] = numberToCheck;
Поскольку мы запустили счетчик с 0, его следует изменить на:

 palPrimes[primeCounter] = numberToCheck;
  

И программа должна работать.