0 java primes for-loop list arraylist
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是到目前为止的代码,但质数不断重复,我需要帮助停止重复
问题出在这一部分:
for (int j = 2; j < upperBound; j++) {
if (i % j == 0) {
break;
} else {
numbers.add(i);
}
}
Run Code Online (Sandbox Code Playgroud)
如果从 2 到所有数字的upperBound
i % j == 0
计算结果为假,您应该只将数字作为素数添加到列表中。
此外,您的内部循环还有另一个错误:
for (int j = 2; j < upperBound; j++)
Run Code Online (Sandbox Code Playgroud)
而不是upperBound
你应该使用变量i
,即:
for (int j = 2; j < i; j++)
Run Code Online (Sandbox Code Playgroud)
您可以优化为:
for (int j = 2; j < i/2; j++)
Run Code Online (Sandbox Code Playgroud)
甚至更好:`
for (int j = 2; j <= (int) Math.sqrt(i); j++)
Run Code Online (Sandbox Code Playgroud)
因此,我建议您提取具有该逻辑的方法,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
并在您的代码中使用它,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
使用 Java 流:
public static List<Integer> getPrimeNumbers(int lowerBound, int upperBound) {
return IntStream.range(lowerBound, upperBound)
.filter(PrimeNumbers::isPrime)
.boxed()
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
该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;
}
Run Code Online (Sandbox Code Playgroud)
如果i
是 0、1 或可被 2 整除的数(不包括 2),则它不是质数。在循环中,我们只需要检查奇数,因为我们之前已经检查过 if n % 2 == 0
。
归档时间: |
|
查看次数: |
164 次 |
最近记录: |