Palindromes

/*
错了好几次,原因是忘了考虑单个字符的情况,还有就是当长度为奇数时
最中间的那个影响很大
*/
#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值