java循环不会停止,也不会正确响应模块

x33g5p2x  于 2021-07-08  发布在  Java
关注(0)|答案(5)|浏览(361)

所以,我有我的代码,基本上,当取某个数时,它会证明模的结果是否等于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;
            }
        }
    }
}

谢谢

ewm0tg9j

ewm0tg9j1#

你可以这样做:

boolean continueLoop = true;
while(continueLoop){
...
}

当你想退出循环时,你可以简单地说

continueLoop=false;
eiee3dmh

eiee3dmh2#

你正在冲出困境 switch ,而不是来自 while 循环。可以使用标志退出while循环或 System.exit(0); 退出程序。

tv6aics1

tv6aics13#

首先:你的switch语句不正确。你在每一个案例的结尾都少了一个“刹车”;在当前代码中,2、3、4、7和11最后都会打印出数字,而对于2、3、5、7,pfactor将是11。我假设“case11”中的中断意味着中断循环,而实际上它中断了开关标签。要从开关内部断开循环,必须为其创建自定义标签:

loop: while(true){
...}

然后打电话 break loop; 从开关上。
如果要避免开关箱中的断开,可以改用箭头运算符:

switch(pfactor){
  case 2 ->pfactor=3;
  case 3 ->pfactor=5;
  ...
}
wfsdck30

wfsdck304#

这个 break 在您的case中,11引用switch语句的作用域并将跳出它,而不是您的循环。另外,你失踪了 break 在每一个案例之后的陈述,意味着如果你达到案例2,你也会经历案例3、5、7和11,最终以 pfactor = 11; . 这意味着,如果13195%2和13195%11都不是0,那么您将进入一个无限循环。
首先你应该加上 break 在每个case后面的语句,在case11中设置一个boolean标志,如果为true,则中断循环。

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;
    }
}
yzxexxkh

yzxexxkh5#

除了其他人已经指出的问题。使用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个交换机分支了吗?
把素数放在一个数组上,对它们进行迭代,然后进行必要的计算。

相关问题