我正在尝试用Java创建一个Eratosthenes的Sieve,但我写的代码似乎有缺陷。 我想知道是否有其他人可以发现我的错误,因为我不能。我得到的输出只是[2],这意味着我的主循环不起作用。我刚刚开始使用Java,所以如果你能给出详细的答案,我将不胜感激。
我的代码:
public static int[] primes(int n)
{
//Variable assignement
double sqrt;
List<Integer> primes= new ArrayList<Integer>();
//Adds 2 to primes so i don't need to include the even numbers in my for loop.
if(n>1)
{
primes.add(2);
}
//For loop that goes through the oneven numbers up to n
for(int counter1=3;counter1<=n;counter1+=2)
{
sqrt=Math.floor(Math.sqrt(0.0+counter1));
//for loop that tests if the first for loops number is prime
for(int counter2=0;sqrt<=primes.get(counter2);counter2++)
{
if(counter1 % primes.get(counter2) != 0 && counter2 ==sqrt)
{
primes.add(counter1);
}
if(counter1 % primes.get(counter2)==0)
{
break;
}
}
}
return convertIntegers(primes);
}
//Converts the list to an array
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
for (int i=0; i < ret.length; i++)
{
ret[i] = integers.get(i).intValue();
}
return ret;
}
答案 0 :(得分:3)
if(counter1 % primes.get(counter2)==0);{
break;}
}
不太可能有帮助。
。在开始大括号之前你有一个分号 - 你的休息将会被执行。答案 1 :(得分:2)
我没有仔细检查您的代码,但可能存在精确问题。
请注意,double
可能不会精确表示整数值,因此即使counter2 ==sqrt
似乎是整数,sqrt
也可能为false。
要防止这种情况,请尝试以下操作:
//this is not necessarily a square root anymore, btw :)
int sqrt = (int) Math.floor( Math.sqrt( (double)counter1 ) );
...
for( ... ) {
...
if(... && counter2 ==sqrt ) {
...
}
...
}
编辑:
稍微进行分析会产生这样的结果:
假设n = 5,因此在您的代码中将执行以下步骤:
counter1 = 3
sqrt = 1
// floor(sqrt(2))counter2 = 0
counter1 % primes.get(counter2) != 0 && counter2 ==sqrt
但3 % 2 = 1
以来,0 != 1
为false
自counter1 % primes.get(counter2)==0
3 % 2 = 1
为false
counter2 = 1
(下一次迭代)primes.get(counter2)
会引发异常,因为primes.get(1)
需要primes
才能拥有至少2个元素。您可能尝试的是counter2 <=sqrt
。