[英]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.