查找素数

时间:2016-03-02 18:31:27

标签: java loops

我试图从命令行中取两个参数,第一个数字是起点,第二个是在此之后应该找到多少素数。我需要打印多次找到的素数,就像第二个命令参数所说的那样。我无法弄清楚如何让它运行正确的次数,然后找到素数。这是我尝试过的:

int values = Integer.parseInt(args[0]);   
int loopAmount = Integer.parseInt(args[1]);

for (int i = 2; i <= loopAmount; i++) {
    loopAmount++;
    if (values % i != 0) {
        values++;
        System.out.println(i);
    }
}

3 个答案:

答案 0 :(得分:4)

你的主循环应该是这样的:

int start = Integer.parseInt(args[0]);

int count = Integer.parseInt(args[1]);

for (int candidate = start, i = 0; i < count; ++candidate) {
    if (isPrime(candidate)) {
        i++;
        System.out.println(candidate);
    }
}

我替换了变量名称,使其对目的更有意义。

在循环内部,isPrime方法是您必须实现的方法:如果它接收的参数是素数,则返回true,否则false

答案 1 :(得分:0)

如果我理解正确,你想从X开始找到N个素数。代码应该非常简单:

int X = Integer.parseInt(args[0]);
int N = Integer.parseInt(args[1]);
int C = 0;
while (C < N)
{
    for(int i=2; i< X; i++)
    {
        if(X % i == 0){
            X++;
            continue;
        }
    }
    System.out.println(X);
    X++;
    C++;
}

答案 2 :(得分:0)

优化版本:

// cache already found primes
final List<Integer> primes = new ArrayList<>();

/**
 * Find {@code count} prime numbers starting at {@code start} inclusive
 */
public void findPrimes(int start, int count) {
    for (int i = 2; count > 0; i++) {
        if (isPrime(i) && i >= start) {
            System.out.println(i);
            count--;
        }
    }
}

private boolean isPrime(final int i) {
    int sqrt = (int)Math.sqrt(i);
    for (int prime : primes) {
        if (i % prime == 0) {
            return false;
        }
        if (prime > sqrt) {
            break;
        }
    }
    primes.add(i);
    return true;
}
  1. 我们确实需要检查最多只有sqrt的除数。
  2. 我们确实只需找到素数除数,因为任何数字都可以写成product of prime numbers