Java 如何回忆一个函数,Eratosthenes筛

Java 如何回忆一个函数,Eratosthenes筛,java,sieve-of-eratosthenes,Java,Sieve Of Eratosthenes,我正试图写一段代码,用埃拉托什筛算出素数。我必须包括一个函数,它将接受一个数字,并将该数字的所有倍数进行交叉。对于测试,我将第一个数字设置为2,第二个数字设置为3。它适用于第一个数字,但不适用于第二个数字,无论数字的顺序如何,也就是说,如果我先在函数中输入3。我知道还有其他完整的埃拉托什尼筛子,但我想试着用我第一次想到的方式来做 public static void main(String[] args) { // TODO Auto-generated method stub

我正试图写一段代码,用埃拉托什筛算出素数。我必须包括一个函数,它将接受一个数字,并将该数字的所有倍数进行交叉。对于测试,我将第一个数字设置为2,第二个数字设置为3。它适用于第一个数字,但不适用于第二个数字,无论数字的顺序如何,也就是说,如果我先在函数中输入3。我知道还有其他完整的埃拉托什尼筛子,但我想试着用我第一次想到的方式来做

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);
    System.out.println("Which number would you like to calculate up to?");
    int n = input.nextInt();
    input.close();

    int x = 0;
    int newNumber = 2;
    int numbers[] = new int[n];
    while(newNumber <= n){
        numbers[x] = newNumber;
        x++;
        newNumber++;
    }

    int currentNumber = 2; 
    int finalNumber[] = markOfMultiples(n, numbers, currentNumber);
    for(int y = 0;y < n-1;y++){
        System.out.print(finalNumber[y] + ", ");
    }

    currentNumber = 3; 
    int secondNumber[] = markOfMultiples(n, numbers, currentNumber);
    for(int y = 0;y < n-1;y++){
        System.out.println(secondNumber[y]);
    }

}

public static int[] markOfMultiples(int n, int numbers[], int currentNumber){

    int originalNumber = currentNumber;
    while(currentNumber<n){
        currentNumber = currentNumber + originalNumber;
        int count2 = 0;
        while(currentNumber != numbers[count2] && currentNumber<=n && count2<n){            
            count2++;
        }
        numbers[count2] = 0;
    }
    return numbers;
}
我得到的错误是:线程主java.lang.ArrayIndexOutOfBoundsException中的异常:20

在Siveoferatostenes.siveoferatostenes.markofmultiplessiveoferatostenes.java:46

在siveoferatostenes.siveoferatostenes.main siveoferatostenes.java:28

第28行是我调用函数的时候:int secondNumber[]=markOfMultiplesn,numbers,currentNumber


第46行是当前的号码!=numbers[count2]&¤tNumber在访问numbers[count2]之前,您需要测试count2是否
while(count2 < n && currentNumber != numbers[count2] && currentNumber<= n){            
    count2++;
}

在访问数字[count2]之前,您需要测试count2是否小于n:

while(count2 < n && currentNumber != numbers[count2] && currentNumber<= n){            
    count2++;
}

如果你想让这种方法发挥作用,你可以按照@Thierry建议的方法,首先在while循环中检查count2
numbers[count2] = 0
使用if子句检查count2是否在索引末尾。e、 g

if (count2 < n) {
    numbers[count2] = 0;
}
x会和newNumber不一样吗?两个变量都需要吗?这种排序或重复出现在代码中的其他地方-要坚持的原则称为

在markOfMultiples方法中,是否有更简单的方法移动原始编号位置上的索引?提示:是的,有

您真的需要数字[]数组中的实际数字吗?如果你知道如何重复调用markOfMultiples来表示n的高值,那么你将得到大量的零和素数作为整数值。如果使用数组索引给出素数,那么1和0或True和False的数组就足够了吗


如果你想让这种方法发挥作用,你可以按照@Thierry建议的方法,首先在while循环中检查count2
numbers[count2] = 0
使用if子句检查count2是否在索引末尾。e、 g

if (count2 < n) {
    numbers[count2] = 0;
}
x会和newNumber不一样吗?两个变量都需要吗?这种排序或重复出现在代码中的其他地方-要坚持的原则称为

在markOfMultiples方法中,是否有更简单的方法移动原始编号位置上的索引?提示:是的,有

您真的需要数字[]数组中的实际数字吗?如果你知道如何重复调用markOfMultiples来表示n的高值,那么你将得到大量的零和素数作为整数值。如果使用数组索引给出素数,那么1和0或True和False的数组就足够了吗


这是学校的作业吗?我们在我的学校做这个。是的,这是一个学校作业,在Java中,你可以从例如numbers.length;不需要传入数组参数的单独长度。这是学校作业吗?我们在我的学校做这个。是的,这是一个学校作业,在Java中,你可以从例如numbers.length;不需要传入数组参数的单独长度。@bike3有相同的例外?对不起,我忘了提一下,现在说第50行数字[count2]=0有问题@bike3也有同样的例外?对不起,我忘了提一下,它现在说第50行数字[count2]=0有问题;