题目描述:
给你一个整数x,如果x是回文数,输出ture,否则,输出false。
其中
−
2
31
<
=
x
<
=
2
31
−
1
-2^{31}<=x<=2^{31}-1
−231<=x<=231−1
示例:
示例1:
输入:123
输出:false
示例2:
输入:121
输出:ture
示例3:
输入:-121
输出:false
思路:
首先,很显然,若x是负数,那么就一定不是回文数。
若x是正数,那我们进一步判断。
以12345677654321为例,我们会判断最高位和最低位的数字是否相等,即1和1是否相等。最高位的1我们用x除以10000000000000(即10*(x的位数-1))(10的14次),最低位的1我们直接取余就好了。
下一步,我们判断第二高位和第二低位的数字是否相等,即2和2是否相等。这时,第二低位怎么表示呢?当第一次判断完毕之后,给x重新赋值,使x=x/10,那这时,x=1234567765432,这时再对x重新取余就可以表示低位的2了。高位的2,同样,取整,使得x除以1000000000000(即10*(x的位数-2))(10的13次),得到12,再取余可得到2。
那我们需要判断几次呢?这与x是几位数有关。若x是四位数,那么需要两次;若x是五位数,需要两次。若x是七位数,需要三次,x是八位数,需要四次…
所以对于输入的x,我们需要判断x是几位数。下面我是用的函数。
进行完上述步骤,如何判断输入的x是否为回文数呢?
首先想到的就是在循环内部,若判断出来相应位数的两个数字不相等,那就输出“false”。因此,如果不是回文数,是很好处理的。
那对于回文数,我们可以设置一个标志量flag,初始化为1,若判断出不是回文数,则改变flag=0。
进行完循环之后,我们进一步判断flag的值,若flag还是为1,那么就是回文数了。
代码实现:
#include <stdio.h>
#include <math.h>
int fun(int x);
int main (void)
{
int x,n,i,count;
int flag=1;
scanf("%d",&x);
if (x<0)
printf("false");
count=fun(x);n=count; //counnt为x的位数,但后面要用到,但又不想要被修改,于是将此赋值给n
for (i=1;i<=count/2;i++)
{
if ((int)(x/pow(10,n-i))%10 != x%10) //这里要注意%号的两边都必须是整数
{
flag=0;
printf("false");
break;
}
x=x/10;
}
if (flag==1)
printf("ture");
return 0;
}
//函数fun用来判断一个数是几位数
int fun(int x)
{
int i=0;
while(x>0)
{
i++;
x=x/10;
}
return i;
}