判断一个数字是否是回文数||取整与取余

题目描述:
给你一个整数x,如果x是回文数,输出ture,否则,输出false。
其中 − 2 31 < = x < = 2 31 − 1 -2^{31}<=x<=2^{31}-1 231<=x<=2311
示例:

示例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;   
}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

釉色清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值