解析:该题分为两个部分,一个是判断是否为回文数,一个是判断是否为镜像数
回文数:利用循环判断前面的字符和该字符对称的后面字符是否一致,如果遇到不一致就不是回文数
镜像数:利用循环判断前面字符的镜像字符和该字符对称的字符是否一致,如果遇到不一致就不是镜像数
了解ctype头文件,该题中用到了isalpha,这是用于判断该字符是否是字母,除此之外还有很多方便的函数详见
https://blog.csdn.net/qq_23827747/article/details/79705576?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161146821116780261998556%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161146821116780261998556&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-79705576.pc_search_result_cache&utm_term=ctype.h&spm=1018.2226.3001.4187
代码如下:
#include<stdio.h> #include<string.h> #include<ctype.h> char rev[] = { "A 3 HIL JM O 2TUVWXY51SE Z 8 " };//每一个字符的镜像字符放在一个数组中,每个字符减去A得到下标,这个数组的下标就是该字符的镜像字符 char sim(char c) //求出镜像数并返回 { if (isalpha(c))return rev[c - ‘A‘]; else return rev[c - ‘0‘ + 25]; } int main(void) { const char* msg[] = { "is not a palindrome.","is a regular palindrome.","is a mirrored string.","is a mirrored palindrome." };//需要用const,因为数组中存放的都是指针,给出的字符串是const char*类型所以需要const char ch[999]; while (scanf("%s", ch) == 1) { int q = 1, w = 1;//用于判断是否为回文数和镜像数 int len = strlen(ch); int i; for (i = 0; i < (len + 1) / 2; i++) { if (ch[i] != ch[len - 1 - i]) q = 0;//判断前后字符是否一致 if (sim(ch[i]) != ch[len - 1 - i]) w = 0;//判断前面的镜像字符是否和后面字符一样 } printf("%s -- %s\n\n", ch, msg[w * 2 + q]); } return 0; }
原文:https://www.cnblogs.com/loliconsk/p/14320764.html