回文串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; }