【问题标题】: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 分支了吗?

            将素数放在一个数组上,对它们进行迭代,然后进行必要的计算。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-07-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-30
              • 2021-08-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多