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