簡體   English   中英

使用 Java 中的列表方法找到邊界之間的素數

[英]find the prime numbers between bounds using list method in Java

public class PrimeNumbers {
    public static void main(String[] args) {
        System.out.println(getPrimeNumbers(3, 10));
    }

    public static List<Integer> getPrimeNumbers(int lowerBound, int upperBound) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = lowerBound; i <= upperBound; i++) {
            for (int j = 2; j < upperBound; j++) {
                if (i % j == 0) {
                    break;
                } else {
                    numbers.add(i);
                }
            }
        }
        return numbers;
    }
}

這是到目前為止的代碼,但素數不斷重復,我需要幫助來停止重復

問題出在這部分:

for (int j = 2; j < upperBound; j++) {
    if (i % j == 0) {
        break;
    } else {
        numbers.add(i);
    }
}

如果從 2 到upperBound i % j == 0的所有數字評估為假,您應該只將數字作為素數添加到列表中。

此外,您的內循環還有另一個錯誤:

for (int j = 2; j < upperBound; j++)

而不是upperBound你應該使用變量i ,即:

for (int j = 2; j < i; j++)

您可以優化為:

for (int j = 2; j < i/2; j++)

甚至更好:`

for (int j = 2; j <= (int) Math.sqrt(i); j++) 

因此,我建議您提取具有該邏輯的方法,如下所示:

private static boolean isPrime(int i) {
     final int upperLimit = (int) Math.sqrt(i);
     for (int j = 2; j <= upperLimit; j++)  {
        if (i % j == 0) {
            return false;
        }
    }
    return true;
}

並在您的代碼中使用它,如下所示:

public static List<Integer> getPrimeNumbers(int lowerBound, int upperBound) {
    List<Integer> numbers = new ArrayList<>();
    for (int i = lowerBound; i <= upperBound; i++) {
        if(isPrime(i))
            numbers.add(i);
    }
    return numbers;
}

使用 Java 流:

public static List<Integer> getPrimeNumbers(int lowerBound, int upperBound) {
    return IntStream.range(lowerBound, upperBound)
                    .filter(PrimeNumbers::isPrime)
                    .boxed()
                    .collect(Collectors.toList());
}

isPrime方法可以進一步優化,例如(假設i為正):

private static boolean isPrime(int i) {
     if (i < 2)  return false;
     else if (i == 2) return true;
      else if (i % 2 == 0) return false;

     final int upperLimit = (int) Math.sqrt(i);
     for (int j = 3; j <= upperLimit; j += 2)  {
        if (i % j == 0) {
            return false;
        }
    }
    return true;
}

如果i是 0、1 或可被 2 整除的數(不包括 2),則它不是素數。 在循環中,我們只需要檢查奇數,因為我們之前已經檢查過 if n % 2 == 0

暫無
暫無

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

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