Java函数查找素数不起作用

时间:2014-03-23 05:20:00

标签: java arrays arraylist primes

该函数采用整数N.该函数必须打印从2到N的所有素数(包括N,如果N本身是素数)。

我有这个功能,它运行,但它正在跳过一些素数,甚至包括一些像8这样的偶数。我似乎无法找到造成这种情况的错误。

以下是我的代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class PrimeNumbers {

    List <Integer> primeList = new ArrayList<Integer>();
    public ArrayList<Integer> findPrimes(int n){

        if(n == 2){
            primeList.add(n);
        }
        else{
            //should I have i=i+2 instead of i++ to move faster? 
           //If so, by doing this, it causes weird and different 
          //output when running
            for(int i=2; i<=n; i++){
                if(n%i != 0){
                    primeList.add(i);
                }
            }

        }

        return (ArrayList<Integer>) primeList;
    }

    public static void main(String[] args) {
        PrimeNumbers pn = new PrimeNumbers();

        System.out.println(pn.findPrimes(15));
    }

}

3 个答案:

答案 0 :(得分:2)

你的逻辑是完全倒退的。如果你测试了所有可能的除数,你只能说一个数字是素数。您当前正在添加具有非零余数的任何数字,即BACKWARDS。非零余数意味着它不能被完全整除,这意味着它不是您正在测试的因素的倍数,例如

8 % 3 -> 2
2 != 0 -> true
therefore 8 is prime

您只能在完成循环后进行.add()来电,并且没有测试结果如下:

is_prime = true; // assume prime
for(i = 2; i <= n; i++) {
     if (n % 2 == 0) { // no remainder, even divisible, therefore NOT primt
         is_prime = false;
         break; // abort the loop, no point in testing more
     }
}

是的,您可以通过在3开始测试并跳过2来提高效率。由于2是唯一的偶数素数,因此任何其他偶数都不可能是素数,因为2是所有偶数的除数。所以测试3,5,7,9等......

e.g。

  test if `n` is even and `!= 2` - if so, then it's NOT prime
  run 3,5,7,... loop to test everything else

答案 1 :(得分:2)

您查找素数的逻辑不正确。

现在,您的代码所做的是: 1.迭代N的所有整数 2.找到N不能除以的任何整数,并将它们添加到列表中。 这与素数无关。

相反,您的代码应该执行以下操作: 1.迭代N的所有整数 2.对于这些整数中的每一个(比如说M),运行一个子循环迭代它下面的所有整数,并检查这些整数是否都不能除M。 如果子循环完成而没有找到M的除法器,则将M添加到列表中 - 它是素数(不能除以1和它本身之外的任何整数)。

检查数字(2或以上)是否为素数的简单代码:

public boolean isPrime(int num)
{
    for (int i = 2; i < num; ++i)
    {
        if (num % i == 0)
        {
            return false;
        }
    }

    return true;
}

对此有很多优化,它本身就是一个世界。

答案 2 :(得分:2)

您所做的就是找到n因素。如果n添加,则测试导致它的每个数字是n % i != 0的因子。

您需要做的是从2迭代到n,对于这些数字的每个,测试它是否为素数。你需要两个循环。我建议创建一个确定素数的方法,我猜你当前的方法是找不到的。只需将if (n % i != 0)替换为if(isPrime(i))

即可
public static boolean isPrime(long n) {
    // eliminate the simple cases
    if (n < 2) {
        return false;
    } else if (n == 2) {
        return true;
    }

    // only test up until the square root of that number
    for (int i = 2; i < Math.pow(n, 0.5) + 1; i++) {
        if (n % i == 0) {
            return false; // found a factor, it's not prime
        }
    }
    return true; // hasn't found a factor and returned false, so it's prime
}

然后在你当前的代码中:

for(int i=2; i<=n; i++){
    if(n%i != 0){
        primeList.add(i);
    }
}

只需将if(n%i != 0){更改为if(isPrime(i))

即可

所以就是这样:

for(int i=2; i<=n; i++){
    if(isPrime(i)) {
        primeList.add(i);
    }
}