为什么当我尝试打印所有小于 10 的素数时,数字 4 也会被打印出来?
Why when I try to print all prime numbers below 10 the number 4 is also printed with them?
我正在尝试创建一个程序,将所有素数加起来达到一定数量。在构建程序时,我遇到了一个问题。每当我尝试打印所有小于 10 的质数时,它都会打印出来,而且 4.I 也无法弄清楚为什么要打印 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
在 checkIfPrime()
中,for
循环具有条件
i < potentialPrimeNumbeer / 2
i = 2
和 potentialPrimeNumbeer = 4
这是 2 < 2
,这是错误的。因此 for
-loop 永远不会执行并且 checkIfPrime()
returns true
.
for (int i = 2; i <= potentialPrimeNumbeer / 2; i++)
大于或等于将起作用,因为现在您将进入循环。否则所有for循环条件都不满足,不进入循环,返回True。
您打算测试小于等于(不仅仅是小于),但是您可以通过展开第一个测试(被二整除)来改进您的算法。然后你可以从三个开始,每次迭代增加两个值(将你的运行时间减半)。我们可以通过停止在小于或等于 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;
}
我正在尝试创建一个程序,将所有素数加起来达到一定数量。在构建程序时,我遇到了一个问题。每当我尝试打印所有小于 10 的质数时,它都会打印出来,而且 4.I 也无法弄清楚为什么要打印 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
在 checkIfPrime()
中,for
循环具有条件
i < potentialPrimeNumbeer / 2
i = 2
和 potentialPrimeNumbeer = 4
这是 2 < 2
,这是错误的。因此 for
-loop 永远不会执行并且 checkIfPrime()
returns true
.
for (int i = 2; i <= potentialPrimeNumbeer / 2; i++)
大于或等于将起作用,因为现在您将进入循环。否则所有for循环条件都不满足,不进入循环,返回True。
您打算测试小于等于(不仅仅是小于),但是您可以通过展开第一个测试(被二整除)来改进您的算法。然后你可以从三个开始,每次迭代增加两个值(将你的运行时间减半)。我们可以通过停止在小于或等于 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;
}