Java ArrayIndexOutOfBoundsException回文素数

时间:2016-10-14 01:38:17

标签: java exception

我一直在为这个代码工作,需要找到用户所需数量的回文素数。当我有while(primeCounter< desiredNumPrimes)时,一切正常,除了它输出一个小于所需数量的素数。我试图通过将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 && 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);
    }
}

2 个答案:

答案 0 :(得分:0)

问题在于初始化。以下3个更改将解决此问题。您正在尝试使用arrayindexoutofbounds,因为您尝试仅更改初始化而不是分配

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

答案 1 :(得分:0)

启动主要计数器为0,因为您还没有找到任何素数。

int primeCounter=0, numberToCheck=2;

你使palPrimes 1的大小小于所需的素数数量,因此它永远不能包含所需数量的素数。取而代之的是

int[] palPrimes = new int[desiredNumPrimes];

然后,检查palPrimes [primeCounter-1] = numberToCheck; 看到我们在0处开始计数器,这应该改为:

palPrimes[primeCounter] = numberToCheck;

该计划应该有效。