使用嵌套 for 循环检查数字是否为质数;如果是这样,将它们添加到集合中——不使用 isPrime 的方法
Using nested for loop to check if numbers are prime; and if so, add them to the set -- WITHOUT using a method for isPrime
总结:尝试学习其他做事方式。 Java 中我理解最少的部分是每段代码如何相互通信。因此,我没有在经典的 isPrime 中使用方法调用来生成循环,而是尝试仅使用嵌套循环来实现。然而,我得到的最接近的是让它增加 2 到 100——它不检查它是否是质数。我提供了示例代码,但我不确定为什么我的代码无法按预期工作。如果可能,请更正我的代码示例并解释您的更正。
我想做的是:将所有质数 2-->100 添加到集合 A(开始前已添加 2)
预期:2、3、5、7、11、13、17、19、23、29、31...
实际:...5,7,9,11,13,15,17...(+=2 一直到 99)
为什么这段代码只计数2,而不是使用我指定的条件?
我的逻辑是:
- 准备一切(创建东西,添加 2 个)
- condition addNumber -- 如果为真,将其添加到集合中,否则,继续下一步
数量
- 外层循环——n——是被测试的数字。 3点开始,
以 2s 递增(没有偶数将是质数),最多 100
- 内循环 -- i -- "i --> n" 范围用于检查是否素数。如果 n 是
能被 i 整除的数不是素数
- 如果没有发现数字违反n%i==0,将其添加到向量中
- 如果发现违反条件,则退出内循环并进入下一个数字
我不明白为什么要中断;没有按我的意图工作。
我不明白为什么,即使 break 以某种方式不起作用,我指定终止条件也不起作用。
我不明白为什么我的支票似乎从未兑现,只是每 2 个数字相加...
我尝试过的事情:尝试中断和终止。在嵌套循环的部分内部和外部移动了东西。
我所能做的就是让它以 2 为单位计数,或者它加起来等于 7,然后停在它不应该加的第一个值 (9)
我做过的研究:
Breaking out of nested loops in Java
Why do we check up to the square root of a prime number to determine if it is prime?
Prime Number Generator Logic
理想的答案是示例代码,其中包含对我的代码的更正和解释。我试图在不使用 isPrime 方法的情况下执行此操作,该方法的逻辑必须在添加数字的循环内。
public static void main(String[] args) {
boolean addNumber = true;
for (int n = 3; n < 100; n = n+2) { //outer loop -- argument
for(int i=2; i< n; i++){ //check if 2-->n is a divisor
if (n % i == 0){ //if it's NOT prime
addNumber = false; //set condition to FALSE
i=n+1; //ensure that inner loop break condition is met
break; //literally tell it to break
}
else {
i=n+1;
break; //if the above is not met, ensure that the inner loop is broken
}
}//closes inner loop
//before exiting loop, add the confirmed prime number to set
if(addNumber) //if we should add it
A.append(n); //add it
}//closes outer loop
System.out.println(A);
}
编辑:原来在这里使用"break;"只是效率的问题。一旦我们确定 n 不是质数,为什么要继续 运行ning 遍历所有剩余的 i 值?我一直在研究这个话题,并提出了一个实际需要使用 break 的场景。
考虑:假设我们不想将 2 到 100 之间的质数添加到集合中,而是想将前 25 个质数添加到集合中。
我们需要将外循环更改为“安全”的东西(不完全正确,但仅用于此示例)假设 n = 1000。这样,我们知道我们不会 运行要添加的素数; 2到1000之间肯定有25个质数
for (int n = 3; n < 1000; n++) {
addNumber = true;
....
现在我们真的需要使用 break 了!在下面的正确代码示例中终止外循环之前(@Nani2015),我们需要添加:
if(A.size() == 25 )
break; //break out of outer loop -- we have the desired number of elements
这会检查我们正在使用的集合 A 是否具有我们想要的元素数量。如果为 FALSE:什么都不做。如果为真:中断(我们完成了)
希望这能澄清事情。在我最初的问题中,使用 break 完全没有必要。我需要做的就是删除 both 中断,我的代码就会按预期工作。但是,在不正确的区域输入中断会导致问题。 "break;" 当您希望或需要在 满足其终止条件之前终止循环时,应使用 。
我建议使用像 Eclipse 这样的 IDE,它会显示是否有死代码。在您的情况下,内部循环的 i++ 是死代码,因为您正在执行 i=n+1。第一次迭代后 i 总是大于 n。
使用以下代码作为参考
public static void main(String[] args) {
HashSet<Integer> A = new HashSet<>();
A.add(2);
boolean addNumber;
for (int n = 3; n < 100; n++) {
addNumber = true;
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
addNumber = false;
break;
}
}
if (addNumber)
A.add(n);
}
System.out.println(A);
}
总结:尝试学习其他做事方式。 Java 中我理解最少的部分是每段代码如何相互通信。因此,我没有在经典的 isPrime 中使用方法调用来生成循环,而是尝试仅使用嵌套循环来实现。然而,我得到的最接近的是让它增加 2 到 100——它不检查它是否是质数。我提供了示例代码,但我不确定为什么我的代码无法按预期工作。如果可能,请更正我的代码示例并解释您的更正。
我想做的是:将所有质数 2-->100 添加到集合 A(开始前已添加 2)
预期:2、3、5、7、11、13、17、19、23、29、31... 实际:...5,7,9,11,13,15,17...(+=2 一直到 99)
为什么这段代码只计数2,而不是使用我指定的条件?
我的逻辑是:
- 准备一切(创建东西,添加 2 个)
- condition addNumber -- 如果为真,将其添加到集合中,否则,继续下一步 数量
- 外层循环——n——是被测试的数字。 3点开始, 以 2s 递增(没有偶数将是质数),最多 100
- 内循环 -- i -- "i --> n" 范围用于检查是否素数。如果 n 是 能被 i 整除的数不是素数
- 如果没有发现数字违反n%i==0,将其添加到向量中
- 如果发现违反条件,则退出内循环并进入下一个数字
我不明白为什么要中断;没有按我的意图工作。 我不明白为什么,即使 break 以某种方式不起作用,我指定终止条件也不起作用。 我不明白为什么我的支票似乎从未兑现,只是每 2 个数字相加...
我尝试过的事情:尝试中断和终止。在嵌套循环的部分内部和外部移动了东西。
我所能做的就是让它以 2 为单位计数,或者它加起来等于 7,然后停在它不应该加的第一个值 (9)
我做过的研究:
Breaking out of nested loops in Java
Why do we check up to the square root of a prime number to determine if it is prime?
Prime Number Generator Logic
理想的答案是示例代码,其中包含对我的代码的更正和解释。我试图在不使用 isPrime 方法的情况下执行此操作,该方法的逻辑必须在添加数字的循环内。
public static void main(String[] args) {
boolean addNumber = true;
for (int n = 3; n < 100; n = n+2) { //outer loop -- argument
for(int i=2; i< n; i++){ //check if 2-->n is a divisor
if (n % i == 0){ //if it's NOT prime
addNumber = false; //set condition to FALSE
i=n+1; //ensure that inner loop break condition is met
break; //literally tell it to break
}
else {
i=n+1;
break; //if the above is not met, ensure that the inner loop is broken
}
}//closes inner loop
//before exiting loop, add the confirmed prime number to set
if(addNumber) //if we should add it
A.append(n); //add it
}//closes outer loop
System.out.println(A);
}
编辑:原来在这里使用"break;"只是效率的问题。一旦我们确定 n 不是质数,为什么要继续 运行ning 遍历所有剩余的 i 值?我一直在研究这个话题,并提出了一个实际需要使用 break 的场景。
考虑:假设我们不想将 2 到 100 之间的质数添加到集合中,而是想将前 25 个质数添加到集合中。
我们需要将外循环更改为“安全”的东西(不完全正确,但仅用于此示例)假设 n = 1000。这样,我们知道我们不会 运行要添加的素数; 2到1000之间肯定有25个质数
for (int n = 3; n < 1000; n++) {
addNumber = true;
....
现在我们真的需要使用 break 了!在下面的正确代码示例中终止外循环之前(@Nani2015),我们需要添加:
if(A.size() == 25 )
break; //break out of outer loop -- we have the desired number of elements
这会检查我们正在使用的集合 A 是否具有我们想要的元素数量。如果为 FALSE:什么都不做。如果为真:中断(我们完成了)
希望这能澄清事情。在我最初的问题中,使用 break 完全没有必要。我需要做的就是删除 both 中断,我的代码就会按预期工作。但是,在不正确的区域输入中断会导致问题。 "break;" 当您希望或需要在 满足其终止条件之前终止循环时,应使用 。
我建议使用像 Eclipse 这样的 IDE,它会显示是否有死代码。在您的情况下,内部循环的 i++ 是死代码,因为您正在执行 i=n+1。第一次迭代后 i 总是大于 n。 使用以下代码作为参考
public static void main(String[] args) {
HashSet<Integer> A = new HashSet<>();
A.add(2);
boolean addNumber;
for (int n = 3; n < 100; n++) {
addNumber = true;
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
addNumber = false;
break;
}
}
if (addNumber)
A.add(n);
}
System.out.println(A);
}