问题
判定一个正整数是否是一个回文数。例如12121是回文数,而1231不是回文数。回文数定义为可以以中间某个数字对称,或者间隔对称,例如123321,或者1234321。详细的回文数介绍请参考维基百科:http://en.wikipedia.org/wiki/Palindromic_number
解法1:转换成字符串
这种方法不仅可以判断一个数是否为回文数,还可以判断文本字符串是否是回文的。
bool isPalindrome(int num) { if(num<0) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>return false; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>return isPalindrome(itoa(num)); <span style="white-space:pre"> </span>} }
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:数字翻转
将整数翻转,之后比较,若跟原来的数相等,就是回文数字 ,//若1234321,倒转之后数字为1234321,相等,就是回文数字.
bool isPalindrome(int x) { if(x<0) { return false; } int tmp=x,res=0; while(tmp) { res=res*10+tmp%10; tmp=tmp/10; } return x==res; }
解法3:逐位判断
即逐个的从高位到中间位,每次取位上的单个数字进行比较,首先确定数值的位数n,然后依次比较(n,1),(n-1,2)....
bool isPalindrome(int x) { //负数 if(x < 0) { return false; } int len = 1; while(x / len >= 10) { len *= 10; //获取位数 } while(x > 0) { //获取首尾值大小 int left = x / len; //第一个除位数 int right = x % 10; //最后一个 if(left != right) { return false; } else { //相等删除首尾 x = (x % len) / 10; len /= 100; } } return true; }