UVa401 Palindromes

原题:输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓回文串,即反转后和原串相同,如abba和madam。所谓镜像串是指左右镜像后原串相同,如 2S 和 3AIAE. 注意,并不是所有的字符在镜像之后都会得到一个合法字符。每个字符的镜像如下图所示:

CharacterReverseCharacterReverseCharacterReverse
AAMMYY
B
N
Z5
C
OO11
D
P
2S
E3Q
3E
F
R
4
G
S25Z
HHTT6
IIUU7
JLVV88
K
WW9
LJXX

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

样例输入:

NOTAPALINDROME 

ISAPALINILAPASI 

2A3MEAS

ATOYOTA

样例输出:

NOTAPALINDROME -- is not a palindrome.


ISAPALINILAPASI -- is a regular palindrome.


2A3MEAS -- is a mirrored string.


ATOYOTA -- is a mirrored palindrome.



代码如下:

#include <cstring>
#include <cstdio>
#include <cctype>
#define maxn 256
const char mir[]= "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
char mirror(char c){
    if(isalpha(c))  return mir[c-'A'];
    else  return mir[26+c-'1'];
}

int main() {
    using namespace std;
    FILE * fstream;
    int r, m;  // 若r为0,则不是回文串;  若m为0,则不是镜像串
    r= m= 1;
    char ch[maxn];
    char c;
    fstream= fopen("回文词.txt", "r"); // 从txt文件中读取
    while (fgets(ch, maxn, fstream)) {  // 读取一组字符串
        r= m= 1;
        int len= strlen(ch);
        ch[len-1]= '\0';  // 去掉末尾的换行符\n
        len= strlen(ch);
        for (int i= 0; i<len/2+1; i++) {
            if((ch[i]!=ch[len-i-1]) && (r==1)) r= 0;
            if((ch[i]!=mirror(ch[len-i-1])) && (m==1)) m= 0;
        }
        if(r==1){
            if(m==1)
                printf("%s -- is a mirrored palindrome.\n\n", ch);  // 回文且镜像
            else
                printf("%s -- is a regular palindrome.\n\n", ch);  // 回文但不镜像
        }
        else
        {
            if(m==1)
                printf("%s -- is a mirrored string.\n\n", ch);  // 不回文但镜像
            else
                printf("%s -- is not a palindrome.\n\n", ch);  // 不回文也不镜像
        }
    }

    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值