【问题标题】:Loop doesn't stop, and doesn't answer to a module correctly循环不会停止,也不会正确响应模块
【发布时间】:2020-11-27 10:28:44
【问题描述】:
所以,我有我的代码,基本上当取某个数字时,它会证明模块的结果是否等于 0,如果是,它将自己除以素数,否则它将去到下一个素数,并尝试获取模块是否等于 0...如果它在 11 之前的所有数字都失败,它将自行打印,然后它将打破循环...问题是,它要么不会中断,要么即使结果为 0 它也不会自行划分,这是我的代码...
import static java.lang.System.out;
public class Problem3 {
public static void main(String[] args) {
int pfactor = 2;
double num = 13195;
double dfactor;
while (true) {
dfactor = pfactor;
if (num % dfactor == 0.0) {
num = num / dfactor;
}
else {
switch (pfactor) {
case 2:
pfactor = 3;
case 3:
pfactor = 5;
case 5:
pfactor = 7;
case 7:
pfactor = 11;
case 11:
out.println(num);
break;
}
}
}
}
谢谢
【问题讨论】:
标签:
java
loops
module
break
【解决方案1】:
首先:您的 switch 语句不正确。在每个案例结束时,您都缺少一个“刹车”;在您当前的代码中,2、3、4、7 和 11 最终都会打印数字,对于 2、3、5、7,pfactor 将为 11。我假设“案例 11”中的中断是为了打破循环,而实际上它打破了开关标签。要从开关内部中断循环,您必须为其创建自定义标签:
loop: while(true){
...}
然后从交换机调用break loop;。
如果你想避免在 switch case 中出现中断,你可以使用箭头操作符来代替:
switch(pfactor){
case 2 ->pfactor=3;
case 3 ->pfactor=5;
...
}
【解决方案2】:
您正在突破switch,而不是来自while 循环。您可以使用标志退出while循环或System.exit(0);退出程序。
【解决方案3】:
案例 11 中的 break 指的是 switch 语句的范围,并且会跳出它,而不是你的循环。此外,您在每个其他案例之后都缺少 break 语句,这意味着如果您到达案例 2,您还将经历案例 3、5、7 和 11,最终以 pfactor = 11; 结束。这意味着,如果 13195 % 2 和 13195 % 11 都不是 0,那么您最终会陷入无限循环。
首先,您应该在每个 case 之后添加 break 语句,并在 case 11 中设置例如一个布尔标志,如果为真,则跳出循环。
boolean breakOut = false;
while (true) {
dfactor = pfactor;
if (num % dfactor == 0.0) {
num = num / dfactor;
}
else {
switch (pfactor) {
case 2:
pfactor = 3;
break;
case 3:
pfactor = 5;
break;
case 5:
pfactor = 7;
break;
case 7:
pfactor = 11;
break;
case 11:
out.println(num);
breakOut = true;
break;
}
}
if (breakOut) {
break;
}
}
【解决方案4】:
你可以这样做:
boolean continueLoop = true;
while(continueLoop){
...
}
当你想退出循环时,你可以简单地说
continueLoop=false;
【解决方案5】:
除了其他人已经指出的问题。使用 switch 会很复杂,请改用数组:
public class Problem3 {
public static void main(String[] args) {
double num = 13195;
int [] prime_numbers = new int []{2, 3, 5, 7, 11};
for(int p : prime_numbers){
while(num % p == 0){
num = num / p;
}
}
System.out.println(num);
}
}
如果你想添加 100 个新质数会发生什么?你去添加 100 个 switch 分支了吗?
将素数放在一个数组上,对它们进行迭代,然后进行必要的计算。