版权声明:虽为原创,欢迎转载。 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);
}