这一题最简单的方式就是存入数组然后按照数组中对应的rev来确认字符串是否是镜像字符串,而至于回文的判断只需要跟自己字符串中心对称位置的另一个字符对比就可以得到。这里需要注意几个小地方,一个是i < (len+1)/2 另一个是在返回字符串时候返回的是rev[ch-'0'+25]
在我自己编写代码编译的时候出现了[Warning] pointer to a function used in arithmetic [-Wpointer-arith] 在检查后发现是27行的if(r(s[i]) != s[len-1-i]) m = 0;错写成了if(r[s[i]] != s[len-1-i]) m = 0;就是()与[]的一个细小的误差,这个报错说的是我这一个数组没有办法正常的找到,而正常的情况应该是去调用r函数来得到返回。
但是第一次做的时候,只过了样例,下面是第一次写的代码,成功WA OTZ
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[] = {"not a palindrome", "a regular palidrome",
"a mirrored string", "a mirrored palindorme"};
char r(char ch)
{
// 这里判断字符是否是英文字符,然后按照对应的rev来返回
//(需要细细体会为什么是 ch - 'A' 和 ch - '0' + 25
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;
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]);
}
return 0;
}
后面参考了网上一些代码成功AC
#include <stdio.h>
#include <string.h>
#define MAXN 1024
char const *ch = "AEHIJLMOSTUVWXYZ12358";
char const *re = "A3HILJMO2TUVWXY51SEZ8";
int is_palindrome(char *str)
{
int i,len = strlen(str);
for(i=0; i<len/2; i++)
{
if(str[i] != str[len-i-1])
return 0;
}
return 1;
}
int is_mirrored(char *str)
{
int table_len = strlen(ch);
int i,j,len = strlen(str);
if(len == 1)
{
for(j=0; j<table_len; j++)
{
if(ch[j] == str[0])
break;
}
if(j == 21 || re[j] != str[0])
return 0;
}
else if(len > 1)
for(i=0; i<len/2; i++)
{
for(j=0; j<table_len; j++)
{
if(ch[j] == str[i])
break;
}
if(j == 21 || re[j] != str[len-i-1])
return 0;
}
return 1;
}
int main()
{
char str[MAXN];
while(scanf("%s",str) != EOF)
{
if(is_palindrome(str))
{
if(is_mirrored(str))
printf("%s -- is a mirrored palindrome.\n\n",str);
else
printf("%s -- is a regular palindrome.\n\n",str);
}
else
{
if(is_mirrored(str))
printf("%s -- is a mirrored string.\n\n",str);
else
printf("%s -- is not a palindrome.\n\n",str);
}
}
return 0;
}