我正在尝试创建一个程序,该程序将所有素数加起来达到一定数量。在构建程序时,遇到了一个问题。每当我尝试打印所有低于10的质数时,它都会打印出它们,也打印出4。我不知道为什么我会打印出4。你们可以帮我解决这个问题吗?
我的代码在这里:
private static boolean isPrime = false;
private static int sum = 0;
public static void main(String[] args) {
addPrimeNumbers();
}
private static void addPrimeNumbers(){
for(int n = 2; n < 10; n++){
if(checkIfPrime(n)){
System.out.println(n); // here it prints out all odds numbers below 10 and 4
sum += n;
}
}
}
private static boolean checkIfPrime(int potentialPrimeNumbeer) {
for (int i = 2; i < potentialPrimeNumbeer / 2; i++) {
if (potentialPrimeNumbeer % i == 0) {
return false;
}
}
return true;
}
输出:
2
3
4
5
7
答案 0 :(得分:2)
for (int i = 2; i <= potentialPrimeNumbeer / 2; i++)
大于或等于将起作用,因为现在您将进入循环。否则,不满足所有for循环条件,它将不进入循环并返回True。
答案 1 :(得分:2)
您打算测试小于等于(而不是小于),但是您可以通过展开第一个测试(除数为2)来改进算法。然后,您可以从三个开始,并在每次迭代时增加两个值(将运行时间减半)。我们可以通过停止在小于或等于potentialPrimeNumber
的平方根的值处来进一步优化它-这样可以进一步减少测试用例的数量。离开,
private static boolean checkIfPrime(int potentialPrimeNumber) {
if (potentialPrimeNumber == 2) {
return true;
}
if (potentialPrimeNumber % 2 == 0) {
return false;
}
for (int i = 3; i <= Math.sqrt(potentialPrimeNumber); i += 2) {
if (potentialPrimeNumber % i == 0) {
return false;
}
}
return true;
}
答案 2 :(得分:1)
在checkIfPrime()
中,for
循环具有条件
i < potentialPrimeNumbeer / 2
对于i = 2
和potentialPrimeNumbeer = 4
,这是2 < 2
,这是错误的。因此,永远不会执行for
循环,并且checkIfPrime()
返回true
。