//输入一个字符串,判断是否为回文串以及镜像串。
//输入是一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0 00 。
//所谓回文串,就是反转以后和原串相同,如a b b a abbaabba 和m a d a m madammadam 。
//所谓镜像串,就是左右镜像之后和原串相同,如2 S 2S2S 和3 A I A E 3AIAE3AIAE 。注意,并不是每个字符在镜像之后都能得到一个合法字符。
//在本题中,每个合法字符的镜像如下表所示:
//————————————————
//Character Reverse
//A A
//E 3
//H H
//I I
//J L
//L J
//M M
//O O
//S 2
//T T
//U U
//V V
//W W
//X X
//Y Y
//Z 5
//1 1
//2 S
//5 Z
//8 8
//————————————————
//输入
//NOTAPALINDROME
//NOTAPALINDROME -- is not a palindrome.//不是回文词
//ISAPALINILAPASI
//ISAPALINILAPASI -- is a regular palindrome.//回文串
//2A3MEAS
//2A3MEAS -- is a mirrored string.//镜像串
//ATOYOTA
//ATOYOTA -- is a mirrored palindrome.//回文词
#include <stdio.h>
#include <string.h>
#include <ctype.h>
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8"; //是镜像串的例子 ,数字要把它再镜像成 //字母看,按照ASCII 的顺序的排列的,
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'];//判断参数c是否为字母,isalpha函数的参数是int c,是整数,不是字符,
//在C语言中,字符就是整数。
return rev[ch - '0' + 25];
}
int main()
{
char s[30];
while (scanf("%s", s) == 1)
{
int len = strlen(s);
int p = 1, m = 1;
for (int i = 0; i < (len + 1) / 2; i++)
{
if (s[i] != s[len - 1 - i])p = 0;//不是回文串
if (r(s[i]) != s[len - 1 - i])m = 0;//不是镜像串
}
printf("%s -- is %s.\n\n", s, msg[m * 2 + p]); //这个设定很巧妙
}
return 0;
}