hdu1318

本文介绍了一个使用C++实现的复杂算法,用于判断字符串是否为镜像回文、普通回文或镜像字符串。代码详细解析了如何处理包含数字和大写字母的字符串,通过比较字符对来确定其属性。

很繁琐,花了将近两个小时。。。。。。。

ContractedBlock.gifExpandedBlockStart.gifView Code
#include"iostream"
using namespace std;
int main()
{
char a[100];
int i,j,L;
while(scanf("%s",a)!=EOF)
{
L
=strlen(a);

int num=0,zf=0,sign=0;
for(i=0;i<L;i++)
{
if(a[i]>='0'&&a[i]<='9') { num=1;}
if(a[i]>='A'&&a[i]<='Z') { zf=1; }
if(a[i]=='O'||a[i]=='0') { sign=1;}
}

int count=0,mark=0;

if(L==1) //单独处理只有一个的情况
{
if(a[0]=='8'||a[0]=='0'||a[0]=='1') { mark++;}
if(a[0]>='T'&&a[0]<='Y')
{
mark
++;
}
if(a[0] == 'H' || a[0] == 'I'||a[0]=='M'|| a[0]=='A'||a[0]=='O')
{
mark
++;
}
if(a[0]=='2'||a[0]=='S'||a[0]=='5'||a[0]=='Z'||a[0]=='3'||a[0]=='E') count++;
printf(
"%s -- ",a);
if(mark==1) printf("is a mirrored palindrome.\n");
else if(mark==0&&count==1) printf("is a mirrored string.\n");
else printf("is a regular palindrome.\n");

}
else
{
if(num==1&&zf==1)
{
for( i=0, j=L-1; j>=L/2+1 , i<L/2; j--, i++)
{

if(a[i]>='A'&&a[i]<='Z')//处理字母的情况
{

if(a[i]>='T'&&a[i]<='Y')
{
if(a[i]==a[j]) { count++; mark++;}
}
else if(a[i] == 'H' || a[i] == 'I'||a[i]=='M'|| a[i]=='A')
{
if(a[i] == a[j]) { count++; mark++; }
}
else if( (a[i] == 'J'&&(a[j] == 'L'||a[j]=='J'))||(a[i]=='L'&&(a[j]=='J'||
a[j]=='L')) ) count++;
else if( (a[i]=='E'&&(a[j]=='3'||a[j]=='E')) || (a[i]=='O'&&(a[j]=='0'
  ||a[j]=='O'))||(a[i]=='Z'&&(a[j]=='5'||a[j]=='Z'))||
(a[i]=='S'&&(a[j]=='2'||a[j]=='S' ))) count++;
}
else if(a[i]>='0'&&a[i]<='9') //处理数字的情况
{

if((a[i]=='8'&&a[j]=='8')||(a[i]=='0'&&a[j]=='0')||(a[i]=='1'&&a[j]=='1'))
{ mark++;}
if((a[i]=='2'&&(a[j]=='S'||a[j]=='2'))||(a[i]=='5'&&(a[j]=='Z'||a[j]=='5'))
||(a[i]=='3'&&(a[j]=='E'||a[j]=='3'))||(a[i]=='0'&&(a[j]=='0'||a[j]=='O'))) count++;

else
{
if(a[i]==a[j]) count++;
}
}
}
}
else
{
for( i=0, j=L-1; j>=L/2+1 , i<L/2; j--, i++)
{
if(a[i]==a[j]) count++;
if((a[i]=='8'&&a[j]=='8')||(a[i]=='0'&&a[j]=='0')||(a[i]=='1'&&a[j]=='1'))
{ mark++;}
if(a[i]>='T'&&a[i]<='Y')
{
if(a[i]==a[j]) { mark++;}
}
if(a[i] == 'H' || a[i] == 'I'||a[i]=='M'|| a[i]=='A'||a[i]=='O')
{
if(a[i] == a[j]) { mark++; }
}
}
}

printf(
"%s -- ",a);
if(count==L/2)
{
if(mark==L/2) printf("is a mirrored palindrome.\n");
else if(num==1&&zf==1) printf("is a mirrored string.\n");
else if(num==0||zf==0) printf("is a regular palindrome.\n");
}
else printf("is not a palindrome.\n");
}
printf(
"\n");
}
return 0;
}

转载于:https://www.cnblogs.com/FCWORLD/archive/2011/03/26/1996160.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值