首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 質因數分解陷阱:for 迴圈變量修改導致邏輯錯誤分析

     編輯:程式設計疑難解答

問題現象

初學者編寫質因數分解程式,輸入 8 期望輸出 2*2*2,但程式在 n=4 時異常跳出迴圈,結果不正確。

錯誤代碼

int n = a.nextInt(); // 輸入 8
for (int k = 2; k <= n / 2; k++) {
    if (n % k == 0) {
        System.out.print(k + "*");
        n = n / k; // 修改 n
        k = 2;     // 嘗試重置 k
    }
}
System.out.print(n);

核心錯誤原因

for 迴圈的結構決定了 k++ 會在每次迴圈體結束時自動執行。

  1. 迴圈體內執行 k = 2。
  2. 迴圈體結束,執行 迭代陳述式 k++,k 變為 3。
  3. 進入下一輪判斷 k <= n/2 (此時 n=4, n/2=2)。
  4. 3 <= 2 為 false,迴圈提前結束。

這就是為什麼「明明設為 2 卻變成 3 導致跳出」的根本原因。

正確解法

方法一:使用 while 迴圈手動控制 (最直觀)

int n = a.nextInt();
int k = 2;
while (k <= n / 2) {
    if (n % k == 0) {
        System.out.print(k + "*");
        n = n / k;
        k = 2; // 重置,下一輪直接從 2 開始試除
    } else {
        k++; // 只有不整除時才增加
    }
}
System.out.println(n); // 最後剩下的 n 即為最大質因數

方法二:優化至 sqrt(n) 並處理重複因子

int n = a.nextInt();
for (int k = 2; k * k <= n; k++) { // 只需遍歷到 sqrt(n)
    while (n % k == 0) { // 內層 while 處理重複因子 (如 8=2*2*2)
        System.out.print(k + "*");
        n /= k;
    }
}
if (n > 1) System.out.print(n); // 剩餘 n > 1 說明是質數

優勢: 時間複雜度 O(√n),邏輯清晰,無需手動重置計數器。

舉一反三

在 for 迴圈中修改迴圈變量 (i--, i=0 等) 是極差的編程習慣,極易引入難以排查的 Bug。需要複雜流程控制時,請優先選擇 while 或 do-while。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved