简单的判断是否是回文串、镜像串,然后自己写的真费劲,没逃掉刘汝佳的书,这里的代码很有技巧性,特别值得学习,额,其实他书上的代码都很精简
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 |
题意:
思路:
/*
UVa 401 Palindromes
题意:输入一个字符串,判断其是否是回文串或者镜像串
输入的字符可能会有不合法的镜像字符,但是保证没有0,
其他所有字母和9个数字
思路:没逃掉刘汝佳的书,将镜像的字符存在一个数组里面,
将输出的字符串存在一个数组里面,不过确实挺好用,然后就是
简单的首位循环判断了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctype.h>
using namespace std;
char rev[40]="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char judge(char c)//相应的镜像符号
{
if(isalpha(c))//如果是字母
return rev[c-'A'];
return rev[c-'0'+25];//如果是数字,+25字母
}
int main()
{
char output[4][30]={"is not a palindrome.","is a regular palindrome.",
"is a mirrored string.","is a mirrored palindrome."};//巧妙,省事
char str[25];
while(scanf("%s",str)!=EOF)
{
int len=strlen(str);
int flag1=1,flag2=1;
for(int i=0;i<(len+1)/2;i++)
{
if(str[i]!=str[len-i-1])//是否回文
flag1=0;
if(judge(str[i])!=str[len-i-1])//是否镜像
flag2=0;
}
//竟然注释掉cout<<flag1<<" "<<flag2<<endl;
printf("%s -- %s\n\n",str,output[flag2*2+flag1]);
}
return 0;
}
/*
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
*/