输入一个字符串,判断是否为回文串与镜像串,输入字符串中保证不含有数字0。
不含有数字0意味着输入的字符串中含有的数字都是1~9中的数字;
**回文串的定义**:顺序输入的字符串与逆序读取返回得到的字符串是相同的,或者
说是反转后与原有串相同的字符串;
**镜像串的定义**:镜像串有点晦涩难理解,笔者认为对镜像串的理解直系影响了这
道题能否解决,镜像串可以理解为关于中间轴左右对称的一系列字符串,但是这
个对称不单单是字母对称而已,也注重开口的对称,比如E的镜像关于垂直轴对称
后其像应该为反向E符号(即数学中的存在符号表示),那么近似使用数字3来表示,
同样的S诸类字母的镜像使用2等数字近似表示,不能在数字中找到对应的镜像字符
就用空格键表示。
那么可以先列出A-Z的镜像字符:A 3 HIL JM O 2TUVWXY51SE Z 8
笔者给出以下代码:
#include<ctype.h>constchar*rev="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
constchar*msg[]={"not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome"};
char r(char ch)
{
if(isalpha(ch)) return rev[ch-'A'];//判断传入的ch是否为字母 return rev[ch-'0'+25]; //实现数字的镜像映射
}
int main()
{
char s[30];
while(scanf("%s",s)==1)
{
int len=strlen(s);
int k=(len+1)/2;
int a=1;
int b=1;
for(int i=0;i<k;i++)
{
if(s[i]!=s[len-1-i]) a=0;//a=0成立条件为非回文符,对应的是msg数组中的a[0] if(r(s[i])!=s[len-i-1]) b=0;//b=0条件为非镜像串
}
printf("%s--is %s",s,msg[2*b+a]);
}
return0;
}