#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//判断一个字符串(不含空格和数字零)是否为回文串和镜像串(一个字符的镜像和与它对称的字符相同)
//此题字符串只含大写字母和数字字符
//此题结果四种,两者都是,是其中一个,两者都不是
//此题镜像:
//ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
//A 3 HIL JM O 2TUVWXY51SE Z 8 //
char *mirrors = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";//存字符常量,可以用数组,可以用字符指针
char getmirror(char ch)
{
if(isalpha(ch))//判断字符ch是否为英文字母,若为英文字母,返回1。若不是字母,返回0
return mirrors[ch-'A'];//此处用法不错
else
return mirrors[ch-'0'+25];//此处用法不错
}
int main()
{
char buffer[100];
int palindrome;//是否为回文串
int mirror;//是否为镜像串
while((gets(buffer))!=NULL){
palindrome=1;
mirror=1;
for(int i=0,j=strlen(buffer)-1;i<=j;i++,j--){
if(buffer[i]!=buffer[j])
palindrome=0;
if(getmirror(buffer[i])!=buffer[j])//由题目给出的镜像可知,两个字符为镜像,就互为镜像
//所以,判断字符串前一半就可
mirror=0;
}
if(palindrome&&mirror)
printf("%s -- is a mirrored palindrome.\n\n",buffer);
else if(palindrome&&!mirror)
printf("%s -- is a regular palindrome.\n\n",buffer);
else if(!palindrome&&mirror)
printf("%s -- is a mirrored string.\n\n",buffer);
else
printf("%s -- is not a palindrome.\n\n",buffer);
}
return 0;
}
/*
// UVa401 Palindromes
// Rujia Liu
#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 palindrome", "a mirrored string", "a mirrored palindrome"};//指针数组用的好
char r(char ch) {
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;
}
*/
UVa 401 回文词(Palindromes)
最新推荐文章于 2022-01-17 20:49:39 发布