示例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; }