UVa401 回文串与镜像串的综合判断

输入一个字符串,判断是否为回文串与镜像串,输入字符串中保证不含有数字0。
不含有数字0意味着输入的字符串中含有的数字都是1~9中的数字;
**回文串的定义**:顺序输入的字符串与逆序读取返回得到的字符串是相同的,或者
说是反转后与原有串相同的字符串;
**镜像串的定义**:镜像串有点晦涩难理解,笔者认为对镜像串的理解直系影响了这
道题能否解决,镜像串可以理解为关于中间轴左右对称的一系列字符串,但是这
个对称不单单是字母对称而已,也注重开口的对称,比如E的镜像关于垂直轴对称
后其像应该为反向E符号(即数学中的存在符号表示),那么近似使用数字3来表示,
同样的S诸类字母的镜像使用2等数字近似表示,不能在数字中找到对应的镜像字符
就用空格键表示。
那么可以先列出A-Z的镜像字符:A   3  HIL JM O   2TUVWXY51SE Z  8 
笔者给出以下代码:
#include<ctype.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'];//判断传入的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]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41879767/article/details/82390438