例题3-3 回文词(Palindromes, UVa401)
阅读原文时间:2023年07月08日阅读:2

输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓 回文串,就是反转以后和原串相同,如abba和madam。所有镜像串,就是左右镜像之后和原
串相同,如2S和3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题 中,每个字符的镜像如图3-3所示(空白项表示该字符镜像后不能得到一个合法字符)。

图3-3 镜像字符
输入的每行包含一个字符串(保证只有上述字符。不含空白字符),判断它是否为回文 串和镜像串(共4种组合)。每组数据之后输出一个空行。
样例输入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出:
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.

#include
#include
#include
char a[] = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored str","a mirrored palindrome"};
char r(char ch)
{
if(isalpha(ch)) return a[ch - 'A'];
else return a[25 + ch - '0'];
}
int main()
{
int p = 1, m = 1;
char s[100];
scanf("%s", s);
int len = strlen(s);
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", s, msg[2*m + p]);
return 0;
}

1.msg是一个二维字符串数组 用char定义 指针可‘降维’ 字符串数组每一条字符串用“字符串”括起来 每一个括起来的字符串算一个单位

2.isalpha(ch);可以判断ch是否为字符 使用该函数就要引用ctype.h

3.若为数字的话 由于ch为字符串 要把字符串变成数字才能表示数组的下标 所以减去一个'0'即可将 ‘数字’ 变为 数字

4.字母表有26个字母  为什么是25+ch呢 是因为数组下标从0开始 25就代表了26个位置

5. for(int i = 0; i <= (len + 1)/2; i++)   其中(len + 1)/2 可以看成是 len/2 + 1/2  这样可以达到四舍五入的目的 当len为奇数时 假如是7 那么除二后就是 3.5 但是计算机只会取3 这样也就是会检查(循环)三次 这样第四位 也就是对称轴的位置检查不了 不过我认为可以不加1 因为只要对称轴两边的字符对称或者镜像就可以了 对称轴没必要检查

6.巧妙地构造p和m 达到输出对应结果的目的