0

我想打印两个数字之间的所有素数。这是我的代码:

package sphere;

import java.math.BigInteger;
import java.io.*;

class PrimeTest2 {
    public static void main(String args[]) throws java.lang.Exception {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String s = r.readLine();
        String [] splitted = s.split(" ");
        BigInteger lower = new BigInteger(splitted[0]);
        BigInteger upper = new BigInteger(splitted[1]);
        int lowerAsInt = Integer.parseInt(splitted[0]);
        int upperAsInt = Integer.parseInt(splitted[1]);
        BigInteger intermediate = lower;

        for (int i=lowerAsInt; i<upperAsInt; i++) {    
            intermediate = intermediate.nextProbablePrime();
            System.out.println(intermediate);
        }
    }
}

当它以 1 10 运行时,输出为:

2
3
5
7
11
13
17
19
23

为什么不停在7点?

4

5 回答 5

5

因为您的程序说运行时间(1 到 9)不会在 10 以下停止。而不是您的循环,您可能想要:

BigIntegerupper = BigInteger.valueOf(upperAsInt);
while (intermediate.compareTo(upper) <= 0) {
  System.out.println(intermediate);
  intermediate = intermediate.nextProbablePrime();
}

看到不同?你的从 1 开始,在 9 停止(小于 10),每次迭代都会打印一个数字。当数字大于上限时,上述停止。

于 2009-07-03T23:36:17.500 回答
1

您将其设置为在 (i<10) 处运行,而不是在素数的值大于 10 时停止

于 2009-07-03T23:36:31.930 回答
0

ilowerASInt到数upperAsInt。您将 i 从 1 数到 10。语句以 1(一)i++递增。i

所以你的循环显示:whilei小于 10,打印一个素数并i以 1 递增。

所以你会得到前 9 个结果。

于 2009-07-03T23:36:29.527 回答
0

您每次将 i 递增 1,因此它将从 i=1 运行到 i=10(9 次)。如果您希望它更早停止设置 i = 中间。

于 2009-07-03T23:37:38.323 回答
0

如果您使用 JDK8,则此方法有效

 BigInteger lower=BigInteger.valueOf(1);
        BigInteger high=BigInteger.valueOf(100);
        Stream.iterate(lower, BigInteger::nextProbablePrime).limit(high.longValueExact())
                .filter(p -> p.compareTo(high) <= 0).forEach(System.out::println);

请不要对上述流使用 parallel(),因为它会降低性能。根据经验,如果您的代码中有 Stream.iterate() 或 Stream.limit(),请不要并行化流。我的 vm 中的一个简单基准显示并行版本比迭代版本慢 4 倍

于 2018-06-02T11:08:10.963 回答