回文词

题目

输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0.

所谓回文串,就是反转以后和原串相同,如abba和madam。

所谓镜像串,就是左右镜像之后和原串相同,如2S和3AIAE。

注意,并不是每个字符在镜像之后都能得到一个合法字符。

在本题中,每个字符的镜像如图所示(空白符表示该字符镜像之后不能得到一个合法字符)。

 

 输入的每行包含一个字符串(保证只有上述字符。不含空白字符),判断它是否为回文串和镜像串(共4种组合)。

每组数据之后输出一个空行。

样例输入:

NOTAPALINDROME

ISAPALINILAPASI

2A3MEAS

ATOYOTA

样例输出:

NOTAPALINDROME - - is not a palindrome.

ISAPALINILAPASI -- is regular palindrome.

2A3MEAS -- is a mirrored string.

ATOYOTA -- is a mirrored palindrome.

 

c实现

#include<stdio.h>
#include<string.h>
#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']; //获取字符在常量数组的下标,取出对应镜像字符,因为这里'A'是数组第一个,可以根据这种方式,ascii编码 
    return rev[ch-'0'+25];    //获取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;
}

 

posted @ 2020-05-19 22:27  Vincent-yuan  阅读(288)  评论(0编辑  收藏  举报