2

我正在尝试在 Java 中创建一个 Eratosthenes 筛,但我编写的代码似乎有缺陷。我想知道是否有其他人可以发现我的错误,因为我不能。我得到的输出只是 [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;
}
4

2 回答 2

3
if(counter1 % primes.get(counter2)==0);{
    break;}
}

不太可能有帮助。您在左大括号前有一个分号 - 您的 break 将始终被执行。

于 2012-04-10T12:35:26.860 回答
2

我没有彻底检查您的代码,但可能涉及精度问题。请注意,它double可能不能精确地表示整数值,因此counter2 ==sqrt即使sqrt看起来是整数也可能是错误的。

为防止这种情况,请尝试以下操作:

//this is not necessarily a square root anymore, btw :)
int sqrt = (int) Math.floor( Math.sqrt( (double)counter1 ) );
...
for( ... ) {
  ...
  if(... && counter2 ==sqrt ) {
    ...
  }
  ...
}

编辑

稍微深入一点的分析得出这样的结论:

假设 n = 5,因此将在您的代码中执行以下步骤:

  1. counter1 = 3
  2. sqrt = 1 // 楼层(sqrt(2))
  3. counter2 = 0
  4. counter1 % primes.get(counter2) != 0 && counter2 ==sqrt是假的,因为3 % 2 = 1BUT0 != 1
  5. counter1 % primes.get(counter2)==0是假的,因为3 % 2 = 1
  6. counter2 = 1(下一次迭代)
  7. primes.get(counter2)抛出异常,因为primes.get(1)需要primes至少 2 个元素。

你可能会尝试的是counter2 <=sqrt

于 2012-04-10T12:48:17.167 回答