初學者編寫質因數分解程式,輸入 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++ 會在每次迴圈體結束時自動執行。
k = 2。k++,k 變為 3。k <= n/2 (此時 n=4, n/2=2)。3 <= 2 為 false,迴圈提前結束。這就是為什麼「明明設為 2 卻變成 3 導致跳出」的根本原因。
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 即為最大質因數
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。