public static int sumDigits(long n) {
int sum = 0;
int Temp;
while (n != 0) {
int remainder = (int)n % 10;
sum += remainder;
Temp = (int)n / 10;
// 缺少關鍵行:n = Temp;
}
return sum; // 死循環,n 永遠不變
}
循環體內計算了 `Temp = n / 10`,但未將 Temp 賦值回 n。導致 `n` 永遠保持原值,條件 `n != 0` 永遠為真,陷入死循環。
public static int sumDigits(long n) {
int sum = 0;
while (n != 0) {
int remainder = (int)(n % 10);
sum += remainder;
n = n / 10; // 關鍵:更新 n,移除最後一位
}
return sum;
}
輸入 `234`:
| 循環輪次 | n 值 | remainder (n%10) | sum 累加 | n 更新 (n/10) |
|---|---|---|---|---|
| 1 | 234 | 4 | 4 | 23 |
| 2 | 23 | 3 | 7 | 2 |
| 3 | 2 | 2 | 9 | 0 |
| 4 | 0 | - | 結束 | - |
public static int sumDigits(long n) {
int sum = 0;
n = Math.abs(n); // 支持負數
while (n != 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
public static int sumDigitsRecursive(long n) {
n = Math.abs(n);
if (n == 0) return 0;
return (int)(n % 10) + sumDigitsRecursive(n / 10);
}
遇到「無輸出」或「程序卡住」,優先檢查循環終止條件是否能被滿足,在循環內加打印日誌或斷點觀察變量變化。