簡體   English   中英

循環不會停止,也不會正確響應模塊

[英]Loop doesn't stop, and doesn't answer to a module correctly

所以,我有我的代碼,基本上當取某個數字時,它會證明模塊的結果是否等於 0,如果是這樣,它將自己除以素數,否則它將 go 到下一個素數,並嘗試獲取模塊是否等於 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;
            }
        }
    }
}

謝謝

首先:您的 switch 語句不正確。 在每個案例結束時,您都缺少一個“剎車”; 在您當前的代碼中,2、3、4、7 和 11 最終都會打印數字,對於 2、3、5、7,pfactor 將為 11。我假設“案例 11”中的中斷是為了打破循環,而實際上它破壞了開關 label。 要從交換機內部中斷循環,您必須為其創建自定義 label:

loop: while(true){
...}

然后調用break loop; 從開關。

如果你想避免在 switch case 中出現中斷,你可以使用箭頭操作符:

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

您正在擺脫switch ,而不是來自while循環。 您可以使用標志退出 while 循環或System.exit(0); 退出程序。

您的案例 11 中的break是指 switch 語句的 scope ,並且會中斷它,而不是您的循環。 此外,您在每個其他案例之后都缺少break語句,這意味着如果您到達案例 2,您還將 go 通過案例 3、5、7 和 11,最終以pfactor = 11; . 這意味着,如果 13195 % 2 和 13195 % 11 都不是 0,那么您最終會陷入無限循環。

首先,您應該在每個案例之后添加break語句,並在案例 11 中設置例如 boolean 標志,如果為真,則退出循環。

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

除了其他人已經指出的問題。 使用開關會使您復雜化,請改用數組:

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 分支了嗎?

將素數放在一個數組上,對它們進行迭代,然后進行必要的計算。

你可以這樣做:

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

當你想退出循環時,你可以簡單地說

continueLoop=false;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM