uva401Palindromes(回文串和镜像串的判断)

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

Character Reverse Character Reverse Character Reverse
A A M M Y Y
B N Z 5
C O O 1 1
D P 2 S
E 3 Q 3 E
F R 4
G S 2 5 Z
H H T T 6
I I U U 7
J L V V 8 8
K W W 9
L J X X
输入的每行包含一个字符串,(保证只有上述字符。不含空白字符),判断它是否为回文串和镜像串(共四种组合)。每组数据之后输出一个空行。
样例输入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出:
NOTAPALINDROME – is not a palindrome.

ISAPALINILAPASI – is a regular palindrome.

2A3MEAS – is a mirrored string.

ATOYOTA – is a mirrored palindrome.


思路:
自定义了函数char r(char ch),参数ch是一个字符,返回值是ch的镜像字符
isalpha是用来判断字符是否为字母的,类似的还有idigit,isprint等等

#include <cstdio>
#include <cstring>
#include <cctype>
const char* rev="A   3  HIL JM O   2TUVWXY51SE Z  8 ";//这个字符数组用来存放所有字符的镜像字符,用于后面的检查
const char* msg[]={"既不是回文串也不是镜像串","仅是回文串","仅是镜像串","既是回文串也是镜像串"};
char r(char ch)
{
    if(isalpha(ch))
        return rev[ch-'A'];
    return rev[ch-'0'+25];
}
int main()
{
    char s[30];
    while(scanf("%s",s)==1)
    {
        int len=strlen(s);
        int p=1,m=1;//p是回文串的判断标志,m是镜像串的判断标志
        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 -- %s.\n\n",s,msg[m*2+p]);/*一个很简洁的输出形式--msg[m*2+p]这个巧妙地输出形式,因为一种只有4种输出可能,可以理解为00,01,10,11,p和m分别表示二进制的两位。这么做避免了用判断语句进行一一判断再输出。  
        if ( P && M ) 11
        if ( P && !M ) 10
        if ( !P && M ) 01
        if ( !P && !M ) 00
        */
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章