輸入一個字符串,判斷它是否爲迴文串以及鏡像串。輸入字符串保證不含數字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;
}