首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言判斷回文數:核心算法與手動試數完整演示

     編輯:關於C語言

前言:回文數——經典算法入門題

回文數即「正讀反讀都一樣」的數字 (如 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 位後的剩餘高位

逐步演示:以 12321 為例

輪次m (剩餘)m % 10 (末位)sum = sum*10 + 末位說明
初始12321-0-
1123210*10+1 = 1取個位 1
212321*10+2 = 12取十位 2
312312*10+3 = 123取百位 3
412123*10+2 = 1232取千位 2
5011232*10+1 = 12321取萬位 1,循環結束

結果:sum=12321 == val → Yes!

非回文示例:1234

輪次m末位sum
初始1234-0
112344
212343
312432
4014321

結果:sum=4321 != 1234 → No!

三、 邊界情況與擴展思考

  1. 負數:通常不視為回文 (負號位置固定)。可加 if (val < 0) return No;。
  2. 單位數:0~9 均為回文,循環一次即結束,邏輯自動覆蓋。
  3. 溢出風險:int 反轉可能超出 INT_MAX (如 1999999999)。工程上用 long long 存 sum 或字串比較避免溢出。
  4. 字串法替代:sprintf(buf, "%d", val) 雙指針首尾比較,無溢出風險、代碼更短,但需緩衝區、速度略慢。

四、 程序員必修內功:手動試數

文章展示的「試數過程」正是**心理模擬執行**。養成習慣:

  1. 寫出變量表 (val, m, sum...)
  2. 按語句順序逐行更新變量值
  3. 關鍵分支點 (循環條件、if 判斷) 畫標記
  4. 對比預期與實際,定位邏輯偏差

這是無調試器時的核心技能,也是 Code Review 時發現邏輯 Bug 的利器。

五、 總結

回文數判斷雖簡單,卻蘊含「狀態保存 (m)」、「增量構建 (sum*10+...)」、「循環終止條件 (m==0)」、「驗證比較 (sum==val)」等通用編程模式。掌握手動試數,就掌握了不依賴 IDE 也能寫出正確代碼的底氣。

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