Palindromes UVA - 401
题目传送门:https://vjudge.net/problem/UVA-401(平台VJ);
题目大意:
给你一个字符串,判断它是否是回文字符串,或者它是一个镜像字符串,或者它是什么都不是;
镜像字符串,比如J -> L , E -> 3, Z -> 5,等等,就是看起来和它相反的数字或字符
AC Code:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
const char *re = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char ss[100],s1[100];
int main()
{
while(gets(ss))
{
int flag = 0;
int len = strlen(ss);
int j = 0;
for(int i = len -1; i >= 0; i--)
{
s1[j++] = ss[i];
}
if(strcmp(ss,s1) == 0)
{
flag = 1;
for(int i = 0; s1[i]; i++)
{
if(isalpha(s1[i]))
s1[i] = re[(int)(s1[i] - 'A')];
else
s1[i] = re[(int)(s1[i] - '0')+25];//因为前面有26个字母,所以加上25
}
if(strcmp(ss,s1) == 0)
{
flag = 2;
}
}
else
{
for(int i = 0; s1[i]; i++)
{
if(isalpha(s1[i]))
s1[i] = re[(int)(s1[i] - 'A')];
else
s1[i] = re[(int)(s1[i] - '0' + 25)];
}
if(strcmp(ss,s1) == 0)
{
flag = 3;
}
}
if(flag == 0)
cout<<ss<<" -- is not a palindrome."<<endl;
else if(flag == 1)
cout<<ss<<" -- is a regular palindrome."<<endl;
else if(flag == 2)
cout<<ss<<" -- is a mirrored palindrome."<<endl;
else
cout<<ss<<" -- is a mirrored string."<<endl;
cout<<endl;
memset(s1,0,sizeof(s1));
}
return 0;
}
也可以将函数包装,以精简代码
看起来更方便,更容易理解些
#include <cstdio>
#include <cstring>
#include <cctype>
const char *rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";//空格分别为3,2,1,1,3,1,2,1
const char *msg[]= {
"not a palindrome",
"a regular palindrome",
"a mirrored string",
"a mirrored palindrome",
};
char r(char ch)
{
if(isalpha(ch)) return rev[ch-'A'];
return rev[ch-'0'+25];//前面有26个字母!
}
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-1-i]) p=0;//不是回文串
if(r(s[i])!=s[len-1-i]) m=0;//不是镜像串
}
printf("%s -- is %s.\n\n",s,msg[m*2+p]);
}
}
或者把判断分别处理
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[1000], mir[1000];
char mirror[]={"1SE Z 8 A 3 HIL JM O 2TUVWXY5"};
int main(){
int len;
int i, flag1, flag2;
while(scanf("%s", str)!=EOF){
len = strlen(str);
for(i = 0; i<len; i++){ /*镜像选择*/
mir[len-i-1] = mirror[str[i]-'1'];
}
mir[len] = '\0'; /*最后要有结束的符号*/
flag1=flag2=0; /*标记的初始化,0代表是,非0代表不是*/
for(i = 0; i<=(len/2); i++){ /*判断是不是回文串*/
if(str[i]!=str[len-i-1]){
flag1 = 1;
break;
}
}
flag2 = strcmp(mir, str); /*判断是不是镜像串*/
printf("%s -- ", str);
if(flag1!=0&&flag2!=0){
printf("is not a palindrome.");
}
else if(flag1==0&&flag2!=0){
printf("is a regular palindrome.");
}
else if(flag1!=0&&flag2==0){
printf("is a mirrored string.");
}
else if(flag1==0&&flag2==0){
printf("is a mirrored palindrome.");
}
printf("\n\n");
}
}