leetcode——三种方法判断回文数

版权声明:虽为原创,欢迎转载。 https://blog.csdn.net/m0_37655357/article/details/85541970

1、第一种方法,利用sprintf函数,将整数格式化到数组中,以单个元素的形式存放,便于访问每一个位数。然后在数组中前后判断,其实这个方法和入栈出栈的思想有点相似,只是不是用明显的用栈的操作。

/*
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入: 121
输出: true

示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?
*/
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>

/** \brief
*判断回文数
* \param int x
* \param
* \return bool
*
*/
bool isPalindrome(int x)
{
    char numTemp[20] = {0};

    //n接收转换了多少个字符
    int n = sprintf(numTemp, "%d", x);
    //负数直接不是回文数
    if(x < 0)
        return false;
    //单个数字必是回文数
    else if(1 == n)
        return true;
    //判断前后是否回文
    else
    {
        for(int i = 0; i < n/2; i++)
        {
            if(numTemp[i] == numTemp[n-i-1])
                continue;
            return false;
        }
        return true;
    }
}

int main()
{
    int x = 1234321;

    bool flag = isPalindrome(x);

    printf("%d\n\n",flag);
}

2、利用回文数的数字特点来判断,这个是在网上看到的,感觉非常巧妙。

#include <stdio.h>
void main(){
    int num,s,y=0;
    printf("Please input numbers: ");
    scanf("%d", &num);
    s=num;
    while(s>0){
        y=y*10+s%10;
        s=s/10;
    }
    if(y==num){
        printf("%d是一个回文数!\n", num);
    }else{
        printf("%d不是一个回文数!\n", num);
    }
}

3、利用栈操作来判断

/*
栈操作判断回文数
*/
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>

#define STACK_LENGTH    20

typedef struct st{
    char num[STACK_LENGTH];   //栈内存
    int top;                 //栈顶指针
}myStack;


//栈初始化,为栈分配内存,并初始化栈顶指针
myStack* stackInit(void)
{
    myStack* p;

    if(p = (myStack*)malloc(sizeof(myStack)))
    {
        p->top = 0;
        return p;
    }
    return 0;
}

//入栈操作
int stackPush(myStack* s, int data)
{
    if(s->top+1 > STACK_LENGTH)
    {
        printf("waring : stack over!!!\n\n");
        return 0;
    }

    s->num[++(s->top)] = data;
    return 1;
}

//出栈操作,返回出栈的元素
int stackPop(myStack* s)
{
    if(0 == s->top)
    {
        printf("waring : stack empty!!!\n\n");
        return 0;
    }

    return (s->num[s->top--]);
}

//释放栈内存
void stackFree(myStack* s)
{
    if(s)
        free(s);
}


/** \brief 利用栈判断回文数
*
* \param
* \param
* \return
*
*/
bool isPalindrome(int x)
{
    char tempNum[STACK_LENGTH] = {0};
    int count = sprintf(tempNum, "%d", x);

    myStack* pStack = stackInit();
    for(int i = 0; i < count; i++)
        stackPush(pStack, tempNum[i]);

    for(int j = 0; j < count; j++)
    {
        if(tempNum[j] != stackPop(pStack))
        {
            stackFree(pStack);
            return false;
        }
    }
    stackFree(pStack);
    return true;
}


int main()
{
    int x = 256;
    bool flag = isPalindrome(x);

    printf("%d\n\n",flag);
}

猜你喜欢

转载自blog.csdn.net/m0_37655357/article/details/85541970