leecode-C语言实现-9. 回文数

一、题目
在这里插入图片描述
在这里插入图片描述
二、解题思路
例如判断123321是不是回文数,让123321每次余除以10,余数为各位上的值,放到一个数组中,再存数值的过程中,我们可以取得这个数字一共有多少位,作为我们的遍历次数进行铺垫,我定两个指针变量分别从头和尾进行遍历,遍历次数需分情况进行判断:
(1)如果位数长度len为奇数,遍历次数为(len-1)/2,举例12321,头尾遍历1=1,2=2,遍历两次即可,遍历次数:(5-1 )/2
(2)如果位数长度len为偶数,遍历次数为len / 2,举例123321,头尾遍历1=1,2=2,3=3遍历两次即可,遍历次数:6/2

头尾遍历时,两值不相等说明此数不是回文数,反之亦然。

有一些特殊情况:
(1)例如负数:-131,反过来131-,可以排除。
(2)零是回文数,反过来也是零。
(3)除零外,末尾为零的数都不是回文数,例如:120,反过来是21。

以下方便大家理解:
123321 / 10 = 12332 … 1
12332 / 10 = 1233 … 2
1233 / 10 = 123 … 3
123 / 10 = 12 … 3
12 / 10 = 1 … 2
1 / 10 = 0 … 1

三、虚机测试代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>

void main()
{
    bool isPalindrome(int x);

    int num = 123321;

    if(isPalindrome(num))
    {
        printf("%d yes!!!\n",num);
    }
    else
    {
        printf("%d no!!!\n",num);
    }
}

bool isPalindrome(int x)
{
    void PrintfArr(int *arr);

    if(x < 0)
    {
        return false;
    }
    else if(x == 0)
    {
        return true;
    }
    else if(x % 10 == 0)
    {
        return false;
    }

    int remainder = 0;
    //int num = pow(2,31) - 1;
    int num = 10;
    int *arr = malloc(sizeof(int) * num);
    int i = 0;
    
    for(i=0;i<num;i++)
    {
        arr[i] = 0;
    }
    
    i = 0;

    while(x / 10 != 0)
    {
        remainder = x % 10;
        x = x / 10;
        arr[i] = remainder;
        printf("x : %d, remainder : %d\n",x,remainder);
        i++;
    }
    arr[i] = x;
    //printf("num : %d\n",num);
    PrintfArr(arr);

    int q,y,arrsize;
    if((i+1) % 2 == 0)
    {
        arrsize = (i+1) / 2;
    }
    else
    {
        arrsize = i / 2;
    }

    for(q=0,y=i;q<arrsize;q++,y--)
    {
        if(arr[q] != arr[y])
        {
            return false;
        }
    }

    return true;
}

void PrintfArr(int *arr)
{
    int i = 0;
    while(arr[i] != 0)
    {
        printf("index: %3d, val : %3d\n",i,arr[i]);
        i++;
    }
    printf("=============\n");
}

四、虚机测试截图
在这里插入图片描述
五、leecode提交代码

bool isPalindrome(int x)
{
    if(x < 0)
    {
        return false;
    }
    else if(x == 0)
    {
        return true;
    }
    else if(x % 10 == 0)
    {
        return false;
    }
    int remainder = 0;
    int num = 10;
    int *arr = malloc(sizeof(int) * num);
    int i = 0;
    for(i=0;i<num;i++)
    {
        arr[i] = 0;
    }
    i = 0;
    while(x / 10 != 0)
    {
        remainder = x % 10;
        x = x / 10;
        arr[i] = remainder;
        i++;
    }
    arr[i] = x;
    int q,y,arrsize;
    if((i+1) % 2 == 0)
    {
        arrsize = (i+1) / 2;
    }
    else
    {
        arrsize = i / 2;
    }
    for(q=0,y=i;q<arrsize;q++,y--)
    {
        if(arr[q] != arr[y])
        {
            return false;
        }
    }
    return true;
}

六、leecode提交截图
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值