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

C語言判斷回文數:數學分解法與字符串法對比實現

     編輯:關於C語言

問題定義

回文數:正讀反讀都一樣的整數,如 121, 12321, 4554。

方法一:數學分解法(不轉字符串)

原始代碼邏輯較繁瑣,核心思想:

  1. 計算數字位數 count。
  2. 若為偶數位,原代碼誤判為非回文(錯誤,如 1221 是回文)。
  3. 從兩端向中間逐位比較:高位通過除法取得,低位通過模運算取得。

修正版簡潔實現:


#include 
#include 

bool isPalindromeMath(long num) {
    if (num < 0) return false; // 負數通常不視為回文
    if (num < 10) return true; // 單位數
    
    long reversed = 0;
    long original = num;
    while (num > 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    return original == reversed;
}

int main() {
    long n;
    printf("Enter a number: ");
    scanf("%ld", &n);
    printf("%ld %s a palindrome.\n", n, isPalindromeMath(n) ? "is" : "is not");
    return 0;
}

優點:O(log n) 時間,O(1) 空間,無溢出風險(若用 long long 存儲反轉值)。

方法二:字符串法(直觀易寫)


bool isPalindromeStr(long num) {
    char buf[32];
    int len = sprintf(buf, "%ld", num);
    for (int i = 0, j = len - 1; i < j; i++, j--) {
        if (buf[i] != buf[j]) return false;
    }
    return true;
}

優點:代碼簡潔,天然處理負號(sprintf 會輸出 -,導致非回文,符合預期)。

原始代碼問題分析

  • 邏輯錯誤:if(count%2==0) yes=0; 錯誤地認為偶數位不可能是回文。
  • 過度複雜:雙重循環計算 bigsum/smallsum 次方,易出錯且效率低。
  • 變量混亂:smallnum = smallnum/=10; 含未定義行為(C 標準不保證賦值副作用順序)。

總結建議

面試與工程中首選數學反轉法或雙指針字符串法,邏輯清晰、邊界處理簡單。避免手工展開位運算除非有特殊性能要求。

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