回文數即「正讀反讀都一樣」的數字 (如 121、12321)。判斷回文數是理解「數字分解重組」、「循環不變量」、「邊界條件」的絕佳切入點。本文提供標準 C 實現、核心邏輯註釋、完整手動試數過程,幫助建立「像計算機一樣思考」的調試能力。
#include <stdio.h>
int main(void) {
int val; // 待判斷數字
int m; // 暫存變量,避免破壞原值
int sum = 0; // 反轉後的數字
printf("請輸入您需要判斷的數字:\n");
scanf("%d", &val);
m = val; // 保留原值用於最終比較
// 核心算法:逐位提取、構建反轉數
while (m) {
sum = sum * 10 + m % 10; // 取末位、進位、累加
m /= 10; // 去掉末位
}
if (sum == val)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
循環第 k 次結束時:
sum = val 最後 k 位數字的反序m = val 去掉最後 k 位後的剩餘高位| 輪次 | m (剩餘) | m % 10 (末位) | sum = sum*10 + 末位 | 說明 |
|---|---|---|---|---|
| 初始 | 12321 | - | 0 | - |
| 1 | 1232 | 1 | 0*10+1 = 1 | 取個位 1 |
| 2 | 123 | 2 | 1*10+2 = 12 | 取十位 2 |
| 3 | 12 | 3 | 12*10+3 = 123 | 取百位 3 |
| 4 | 1 | 2 | 123*10+2 = 1232 | 取千位 2 |
| 5 | 0 | 1 | 1232*10+1 = 12321 | 取萬位 1,循環結束 |
結果:sum=12321 == val → Yes!
| 輪次 | m | 末位 | sum |
|---|---|---|---|
| 初始 | 1234 | - | 0 |
| 1 | 123 | 4 | 4 |
| 2 | 12 | 3 | 43 |
| 3 | 1 | 2 | 432 |
| 4 | 0 | 1 | 4321 |
結果:sum=4321 != 1234 → No!
if (val < 0) return No;。int 反轉可能超出 INT_MAX (如 1999999999)。工程上用 long long 存 sum 或字串比較避免溢出。sprintf(buf, "%d", val) 雙指針首尾比較,無溢出風險、代碼更短,但需緩衝區、速度略慢。文章展示的「試數過程」正是**心理模擬執行**。養成習慣:
這是無調試器時的核心技能,也是 Code Review 時發現邏輯 Bug 的利器。
回文數判斷雖簡單,卻蘊含「狀態保存 (m)」、「增量構建 (sum*10+...)」、「循環終止條件 (m==0)」、「驗證比較 (sum==val)」等通用編程模式。掌握手動試數,就掌握了不依賴 IDE 也能寫出正確代碼的底氣。