17.判斷一個整數是否是回文數


回文數(或迴文數)是指一個像14641這樣“對稱”的數,即:將這個數的數字按相反的順序重新排列后,所得到的數和原來的數一樣。
判定一個正整數是否是一個回文數。例如12121是回文數,而1231不是回文數。
 
解法1:轉換成字符串再判斷
要判斷一個整數是否是回文數,最自然的想法是把整數轉換成一個字符串,然后根據回文的對稱特性進行判斷。數字轉換為字符串可以通過itoa函數實現,判斷字符串是否為回文字符串代碼如下:
bool isPalindrome(string &str)
{
    int begin = 0, end = str.length()-1;
    while (begin < end) {
        if (str[begin] == str[end]) {
            begin++;
            end--;
        } else {
            return false;
        }
    }
    return true;
}

  

解法2:數字翻轉法
因為是整數,所以可以求出該整數的翻轉后的數值,看是否與原來整數相等。如果相等,則是回文數,否則不是。翻轉整數代碼如下,返回值為翻轉后的整數。如12321翻轉后為12321,所以是回文數;而1231翻轉后為1321,與1231不相等,所以不是回文數。
int reverse(int num) 
{
  assert(num >= 0); 
  int rev = 0;
  while (num != 0) {
    rev = rev * 10 + num % 10;
    num /= 10;
  }
  return rev;
}

  

但是這里有個潛在的問題就是翻轉后的整數可能會溢出,當然我們可以用long long之類的類型來保存翻轉結果。但是這個解法總的來看並不完美,我們需要找一個更通用的解法。
 
解法3:數字位判斷法
我們可以找到一個更通用的解法,那就是先比較整數的第1位和最后1位是否相等,如果不等,則直接返回false;若相等,則接下去判斷剩下的位置,如同回文字符串判斷的過程一樣。代碼如下:
bool isPalindrome(int x) 
{
  if (x < 0) return false;
  int div = 1;
  while (x / div >= 10) {
    div *= 10;
  }
  while (x != 0) {
    int l = x / div;  
    int r = x % 10;
    if (l != r) return false;
    x = (x % div) / 10;
    div /= 100;
  }
  return true;
}
如整數為121,則div初始會設為100,因此l=21/100=1是整數的第1位,而r=121%10=1是最后1位。這兩位相等,則繼續循環,設置x為第2為2,此時div除以100變成1,之所以div除以100是因為每次比較了兩個位。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM