簡體   English   中英

使用Java的BigInteger可能素數

[英]Working with Java's BigInteger probable primes

我想打印兩個數字之間的所有素數。 這是我的代碼:

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點?

因為您的程序說運行時間(1到9)不會停止在10以下,所以您可能需要:

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

看到不同? 您的數字從1開始,到9(小於10)停止,在每次迭代中都打印一個數字。 當數字大於上限時,以上操作停止。

您已將其設置為在(i <10)的位置運行,而不是在素數的值大於10時停止

您正在將ilowerASIntupperAsInt 您將i從1計數到10。語句i++ i加1(一)。

因此,您的循環顯示為:當i小於10時,打印質數並以1遞增i

這樣您將獲得前9個結果。

您每次將i遞增1,因此它將從i = 1到i = 10(9次)運行。 如果您希望它更早停止,請設置i =中間。

如果您使用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(),請不要並行化流。 我的虛擬機中的一個簡單基准測試表明並行版本比迭代版本慢4倍

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM