/*
错了好几次,原因是忘了考虑单个字符的情况,还有就是当长度为奇数时
最中间的那个影响很大
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char szChChReverse[26] = {'A',32,32,32,'3',
32,32,'H','I','L',
32,'J','M',32,'O',
32,32,32,'2','T',
'U','V','W','X','Y',
'5'};
char szDigChReverse[9] = {'1','S','E',32,'Z',32,32,'8',32};
int Palindromes(char c1,char c2)
{
char Reverse_c1;
if(isalpha(c1))
{
// printf(" reverse %c\n",szChChReverse[(int)c1-65]);
Reverse_c1 = szChChReverse[(int)c1-65];
}
else
{
Reverse_c1 = szDigChReverse[(int)c1-49];
}
//首先判断is not a palindrome.
//当c1!=c2 同时c1的翻转不等于c2
if(c1 != c2 && Reverse_c1 != c2)
return 0;
//判断is a regular palindrome.
if(c1 == c2 && Reverse_c1 != c2)
return 1;
//然后再判断is a mirrored string.
if(c1 != c2 && Reverse_c1 == c2)
return 2;
//在判断is a mirrored palindrome.
if(c1 == c2 && Reverse_c1 == c2)
return 3;
return 0;
}
int main()
{
char szStr[22];
while(scanf("%s",szStr) != EOF)
{
int iStrLength = strlen(szStr);
int iStatus = 0;
//标记
bool iMirr = false,iMirrPli = false,iRegua = false;
for(int i = 0; i <= iStrLength-i-1;/*这一定要<=原因是处理单个字符*/ i++)
{
iStatus = Palindromes(szStr[i],szStr[iStrLength-i-1]);
if(0 == iStatus)break;
if(1 == iStatus)
{
iMirrPli = false;
iRegua = true;
}
if(2 == iStatus)
{
iMirrPli = false;
iMirr = true;
}
if(3 == iStatus)
{
iMirrPli = (iRegua == true || iMirr == true) ? false : true;
}
}
if(0 != iStatus && false == iMirr && false == iMirrPli)
{
printf("%s -- is a regular palindrome.\n\n",szStr);
}
if(0 != iStatus && true == iMirr && false == iMirrPli)
{
printf("%s -- is a mirrored string.\n\n",szStr);
}
if(0 != iStatus && true == iMirrPli && false == iMirr)
{
printf("%s -- is a mirrored palindrome.\n\n",szStr);
}
if(0 == iStatus)
{
printf("%s -- is not a palindrome.\n\n",szStr);
}
}
return 0;
}
Palindromes
最新推荐文章于 2020-03-10 13:46:14 发布