判断一个整数是不是回文数
首先有以下几个问题需要考虑:
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相加。