题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
又比如:x = -121,从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
方法一:
将输入的整数存到一个字符串数组中,然后再逆序存放到另一个字符串数组中,
再使用strcmp函数比较两个字符串是否相等
方法一代码:
bool isPalindrome(int x){
int len,i,j,t;
char a[100],b[100];
if(x<0) //按照题目要求,负数肯定不是个回文数
{
return false;
}
else
{
//把x转换为字符串形式 存到数组a中
i=0;
while(x!=0)
{
a[i++]=(x%10+'0');
x/=10;
}
a[i]='\0'; //加上字符串结束标志'\0'
//逆序存放到数组b中
len=strlen(a);
j=0;
for(i=len-1;i>=0;i--)
b[j++]=a[i];
b[j]='\0';
if(strcmp(a,b)==0)
return true;
else
return false;
}
}
方法二:
这一方法也是将输入的整数存储到一个字符串数组a中,但是不再用另一个数组存放其逆序数,
而是使用j和i分别指向数组a的第一个数字字符和最后一个数字字符,再用mid表示
数组中间的那个字符,然后利用循环从两头向中间比较,一旦发现有某两个字符不
相等,就将flag置为0,然后结束循环。
循环结束后,当flag==0返回flase,否则的话返回true
方法二代码:
bool isPalindrome(int x){
int mid,i,j,flag=1;
char a[100];
if(x<0)
{
return false;
}
else
{
//把x转换为字符串形式
i=0;
while(x!=0)
{
a[i++]=(x%10+'0');
x/=10;
}
a[i]='\0';
j=0;
i-=1;
mid=(i+j)/2;
for(j=0;j<=mid,i>=mid;j++,i--)
{
if(a[j]!=a[i])
{
flag=0;
break;
}
}
if(flag==0)
return false;
else
return true;
}
}
方法三
方法三没有利用字符串数组将整数逆序存放,而是利用循环将x的逆序数存放在
无符号整数n2中,通过比较x与n2是否相等确定返回值
最开始n2并不是无符号整数类型,而是使用的int 型,但提交的时候有以下错误:
Line 17: Char 9: runtime error: signed integer overflow:
998765432 * 10 cannot be represented in type 'int' [solution.c]
然后猜想是不是在n2=n2*10+t;这句执行时若数太大会使得乘以10那个操作溢出,然后便将 n2 的类型定义为无符号整型使其能表示的范围更大从而避免这个可能出现的错误。
方法三代码:
bool isPalindrome(int x){
int i,j,n1,t;
unsigned int n2; //定义成无符号整数表示的范围更大
if(x<0)
{
return false;
}
else
{
n1=x;
n2=0;
//利用循环用n2表示x的逆序数
while(n1!=0)
{
t=n1%10;
n2=n2*10+t;
n1/=10;
}
if(n2==x)
return true;
else
return false;
}
}