UVa401

这一题最简单的方式就是存入数组然后按照数组中对应的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;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值