我想打印两个数字之间的所有素数。这是我的代码:
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点停止?
答案 0 :(得分:5)
因为你的程序说运行时间(1到9)不会停在10以下而不是你的循环你可能想要:
BigIntegerupper = BigInteger.valueOf(upperAsInt);
while (intermediate.compareTo(upper) <= 0) {
System.out.println(intermediate);
intermediate = intermediate.nextProbablePrime();
}
看到区别?您从1开始并在9(小于10)处停止,在每次迭代时打印一个数字。当数字大于上限时,上面停止。
答案 1 :(得分:1)
你将它设置为运行在哪里(i <10),而不是在素数值大于10时停止
答案 2 :(得分:0)
您正在计算从i
到lowerASInt
的{{1}}。你从1到10计算我。
语句upperAsInt
以1(一)递增i++
。
所以你的循环读取:
当i
小于10时,打印素数并将i
增加为1。
所以你会得到前9个结果。
答案 3 :(得分:0)
你每次递增1,所以它将从i = 1直到i = 10(9次)。如果你想让它先停止设置i = middle。
答案 4 :(得分: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倍