力扣原题
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-
-2^ 31 <= x <= 2^ 31 - 1
方法1–传统概念法
回文数:数字倒过来等于本身
即,逆序前后数字不变
int isPalindrome(int n){
int m=n;
int sum=0;
if (n<0){
return 0;
}
while(n!=0){
sum*=10;
sum+=n%10;
n/=10;
}
if(sum==m){
return 1;//是回文
}else{
return 0;//不是回文
}
}
方法2–逐位比较
通过除和取余,将数字的第一位与最后一位比较,第二位与倒数第二位比较…
这种方法也是可行的,只是在数字位数多的情况下比较麻烦
代码实现
//例如,判断五位回文数,需比较个位与万位,十位与千位
int isPalindrome(int n){
int ge=n%10;
int shi=n/10%10;
int qian=n/1000%10;
int wan=n/10000;
if(ge==wan&&shi==qian){
return 1;//是回文
}
else{
return 0;//不是回文
}
}
方法3–利用字符串
利用字符串可以对方法2进行优化
首先需要将要判断的整数转换为字符串(利用ascll码)。
代码如下
#include<stdio.h>
#include<string.h>
int main()
{
int a;
printf("请输入要转换的整数:");
scanf ("%d",&a);
char s[100];
int i=0;
while(a!=0){
s[i]=a%10+'0';//数字在ascll码表中连续存储
a/=10; //先取的为个位数,所以数字在字符串中逆序存储
i++;
}
s[i]='\0';
printf("转换后的字符串:");
for(int j=i;j>=0;j--){//逆序存储,所以需要逆序输出
putchar(s[j]);
}
}
上段代码的运行结果
接下来就可以遍历数字字符串,逐位比较,进行判断
代码如下
int isPalindrome(char *s){
int i;
int n=strlen(s);
for(i=0;i<n/2;i++){
if(s[i]!=s[n-1-i]){
return 0;//有任意一组不相同即返回0
}
}
return 1;//都相同即为回文数
}
对于字符串和数字的转换
这里引入两个新函数
1.snprintf函数:
作用:将数字转化为字符串;
头文件:<stdio.h>
注:snprintf()函数不是C标准库函数,有些编译器不通用,只作了解
用法:
char s[10];
int x;
snprintf (s,10,"%d",x);
2. atoi函数
作用:将数字字符串转化为数字;
头文件:<stdlib.h>
要注意的点:
atoi函数会跳过字符串首端的空格,找到第一个不是空格的字符
如果跳过这些空格字符后的第一个字符不是数字字符,则直接返回0;
如果跳过这些空格字符后的第一个字符是数字字符,则从这个数字字符开始转换,并向后找连续的数字字符转换 ,如果连续中断,找到不是数字字符的字符,则在此截断,返回前面已经转换好的连续的数字字符。
用法
char s[10];
int n=atoi(s);
利用新函数的解法(只做参考)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>
#include<stdlib.h>
bool isPalindrome(int x){ //原题给的模板是布尔函数,返回值只有0(false)和1(true)
char s1[100];
snprintf (s1,100,"%d",x);
int n=strlen(s1);
char s2[100];
for(int i=0;i<n;i++){
s2[i]=s1[n-1-i];
}
int y=atoi(s2);
if(x==y){
return true;
}else{
return false;
}
}
int main()
{
int x;
scanf("%d",&x);
bool n=isPalindrome(x);
printf("%d",n);
}