回文词(回文数和镜像串)
首先需要知道镜像字符串有哪些有A,E-3,H,I,J-L,L-J,M,O,S-2,T,U,V,W,X,Y,Z-5,1,2-S,3-E,5-Z,8。
然后建立常量数组,存储相对应字母和数字的镜像。建立另一个常量数组,存储输出的判断结果,避免对于if的使用,让代码更加精简。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";//没有镜像的字母或数字的位置用空格补充
const char* msg[] = { "not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome" };
char r(char ch)
{
if (isalpha(ch))
{
return rev[ch - 'A'];
}
return rev[ch - '0' + 25];
}
int main()
{
char s[30];
while (scanf("%s", s) == 1)
{
if (s[0] == '\n') break;
int p, m;
int len = strlen(s);
p = m = 1;
for (int i = 0; i < (len + 1) / 2; i++)
{
if (s[i] != s[len - i - 1])p = 0;//不是回文串
if (s[i] != r(s[len - i - 1]))m = 0;//不是镜像串
}
printf("%s -- is %s.\n\n", s, msg[p + 2 * m]);
}
return 0;
}