回文串uva401(清简出风尘)

大神之所以是大神,是因为其在任何一次回答前都有着思考

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std; 
    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 palidrome."}; 
    //巧妙地利用p,m的数量关系二维数组msg来输出不同结果 
    
    char r(char ch){                      //镜像判断函数 
    if(isalpha(ch))return rev[ch-'A']; //ctype函数:isalpha,idigit,isprint 
    return rev[ch-'0'+25];            //rev数组中,数字在字母之后 
    }
    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-i-1])p=0;    //不是回文 
                if(r(s[i])!=s[len-1-i])m=0; //不是镜像 
            }
        printf("%s -- id %s\n\n",s,msg[2*m+p]); //巧妙地利用p,m的数量关系二维数组msg来输出不同结果 
        }
    return 0;
} 
posted @ 2018-12-14 19:15  易如鱼  阅读(217)  评论(0编辑  收藏  举报