回文數(或迴文數)是指一個像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是因為每次比較了兩個位。