一.题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
二.思路分析
思路一:
先判断是否为负数,如果是,直接返回false;
将该数翻转,如12345翻转为54321,然后判断翻转后的数与原数是否相等,相等返回true,否则返回false;
注:在进行翻转时会使得原数改变,所以可先将原数保存到一个变量里;
思路二:
先判断是否为负数,如果是,直接返回false;
在思路一的基础上,只需判断该数的一半位数即可,如12321,只需判断原数的后一半与前一半是否相等,中间的数字可不用管;与思路一相比,时间复杂度减少了一半;
具体翻转方法参看下方代码;
三.解题代码
解法一:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void isPalindrome(int x) {
if (x < 0)
{
printf("false\n");
}
else
{
int m = 0;
int a = x;
while (0 != x)
{
m = x % 10 + 10 * m;
x = x / 10;
}
if (m == a)
printf("true\n");
else
printf("false\n");
}
}
int main()
{
int x;
scanf("%d", &x);
isPalindrome(x);
return 0;
}
解法二:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) {
printf("false\n");
}
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
if (x == revertedNumber || x == revertedNumber / 10)
printf("true\n");
else
printf("false\n");
}
int main()
{
int x;
scanf("%d", &x);
isPalindrome(x);
return 0;
}
四.get知识点
无