一、判断是否为回文数
1、转为字符串
#include <stdio.h>
#include <string.h>
int main()
{
int i, j, len;
char s[1000] = { 0 };
scanf("%s", s);
len = strlen(s);
for (i = 0, j = len - 1; i < len; i++, j--)
{
if (s[i] != s[j])
{
printf("不是回文数");
return 0;
}
}
printf("是回文数");
}
2、两边同时开始,一位一位的比较
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n < 0)
printf("不是回文数");
int div = 1;
while (n / div >= 10)
div *= 10;
while (n>0)
{
int left = n / div;
int right = n % 10;
if (left != right)
{
printf("不是回文数");
return 0;
}
n = (n%div) / 10;//左右两端各去掉一位数
div /= 100;
}
printf("是回文数");
}
3.反转数字与原数字比较
可能存在的问题是反转后的数字有可能溢出
#include <stdio.h>
int main()
{
int num, s, t = 0;
scanf("%d", &num);
s = num;
if (num<0 || num>0 && num % 10 == 0)
printf("不是回文数");//特判负数和大于0但是个位为0的数一定不是回文数
while (s>0){
t = t * 10 + s % 10;//得到反转数字
s = s / 10;
}
if (t == num){
printf("是回文数");
}
else{
printf("不是回文数");
}
return 0;
}
4、反转一半数字
如果反转的后半部分的数字和前半部分相同即为回文数。
为了确定什么时候反转了一半,我们可以考虑当未反转部分小于或等于反转部分的时候即为反转了一半。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n<0 || n>0 && n % 10 == 0)
{
printf("不是回文数");
}
int rev = 0;
while (n > rev)
{
rev = rev * 10 + n % 10;
n /= 10;
}
if (n == rev || n == rev / 10)//奇数位比较rev/10,偶数位比较rev
printf("是回文数");
else
printf("不是回文数");
}