判断一个整数是不是回文数

  首先有以下几个问题需要考虑:

1. 负数是不是回文数?这里假设负数不是回文数。

2. 如果要求不能用额外的存储空间怎么办?

下面的代码给出四种方法:

View Code
  1 #include <iostream>
  2 #include <cassert>
  3 #include <limits>
  4 #include <numeric>
  5 #include <string>
  6 using namespace std;
  7 
  8 long long reverseNumber(int number)
  9 {
 10     assert(number>0);
 11     long long rev=0;
 12     while (number!=0)
 13     {
 14         rev=rev*10+number%10;
 15         number/=10;
 16     }
 17     return rev;
 18 }
 19 
 20 bool isPalindrome1(int number)
 21 {
 22     bool flag=false;
 23     long long rev=reverseNumber(number);
 24     if (number==rev)
 25     {
 26         flag=true;
 27     }
 28     return flag;
 29 }
 30 bool isPalindrome2(int number)
 31 {
 32     if (number<0)
 33     {
 34         return false;
 35     }
 36     int div=1;
 37     while (number/div>=10)
 38     {
 39         div*=10;
 40     }
 41     while (number!=0)
 42     {
 43         int l=number/div;
 44         int r=number%10;
 45         if (l!=r)
 46         {
 47             return false;
 48         }
 49         number=(number%div)/10;
 50         div/=100;
 51     }
 52     return true;
 53 }
 54 
 55 bool isPalind(int x,int& y)
 56 {
 57     if (x<0)
 58     {
 59         return false;
 60     }
 61     if (x==0)
 62     {
 63         return true;
 64     }
 65     if (isPalind(x/10,y) && (x%10 == y%10))
 66     {
 67         y/=10;
 68         return true;
 69     }
 70     else
 71     {
 72         return false;
 73     }
 74 }
 75 bool isPalindrome3(int number)
 76 {
 77     return isPalind(number,number);
 78 }
 79 
 80 bool isPalindrome4(int number)
 81 {
 82     if (number<0)
 83     {
 84         return false;
 85     }
 86     string str="";
 87     while (number!=0)
 88     {
 89         str=char(number%10)+str;
 90         number/=10;
 91     }
 92     int low=0;
 93     int high=str.length()-1;
 94     while (low<=high)
 95     {
 96         if (str.at(low)!=str.at(high))
 97         {
 98             return false;
 99         }
100         low++;
101         high--;
102     }
103     return true;
104 }
105 int main()
106 {
107     int number=98786123;
108     cout<<isPalindrome1(number)<<endl;
109     cout<<isPalindrome1(1221)<<endl;
110     cout<<isPalindrome1(12321)<<endl;
111 
112     cout<<isPalindrome2(number)<<endl;
113     cout<<isPalindrome2(1221)<<endl;
114     cout<<isPalindrome2(12321)<<endl;
115 
116     cout<<isPalindrome3(number)<<endl;
117     cout<<isPalindrome3(1221)<<endl;
118     cout<<isPalindrome3(12321)<<endl;
119 
120     cout<<isPalindrome4(number)<<endl;
121     cout<<isPalindrome4(1221)<<endl;
122     cout<<isPalindrome4(12321)<<endl;
123 }

方法1,2不需要额外的存储空间

方法3递归算法,如果递归的栈不算额外的存储空间,那么方法3也没有使用额外的存储空间

方法4将整数转化成string,然后判断string是否是回文的,需要额外的存储空间

方法一:将number逆转,然后判断逆转之后的数和number是否相等。这里需要考虑的问题是,如果给定的整数没有溢出,但是逆转之后的整数可能溢出。这里采取的方法是强制转换成long long类型。但是这种方法不是语言独立的,有些语言没有long long类型。

方法二: 每次比较整数的头和尾,然后每次去掉整数的头和尾,直到整数为0为止。这里需要注意的是怎样取得整数的头,这个相见代码。

方法三:递归算法。如果题目要求不能使用额外的存储空间,并且递归使用的栈空间不算额外的存储空间,那么递归方法很适合解这一类问题。本题的递归算法很巧妙,也是通过比较对应的位置是否相等来判断的。

方法四:最容易想到的算法。这里需要注意要把一位整数转换成char类型才能和string相加。

参考文章:http://www.leetcode.com/2012/01/palindrome-number.html

posted @ 2012-07-18 21:06  kasuosuo  阅读(1183)  评论(0编辑  收藏  举报