[DOJ 练习] (取余优化) 判断一个字符串不区分大小写是否回文

输入描述

输入一个字符串,以#号结束,不包含空格,占一行

输出描述

判断字符串不区分大小写是否回文,是输出YES,否则输出NO。

输入样例

MadaDAm#

输出样例

YES

写的时候在判断大小写上有了一些想法,可以省去一些步骤,根据的是大小写字母的ASCII码值差为32,所以我们不必像下面这样特意判断 ...他们各自究竟是大写还是小写,也不必判断字符串的大小为奇还是偶,否则遇到 abCba 这类的便会出问题...

啰嗦且不完备的写法

        if((s[i]>='a' && s[i]<='z') || ){
			if(s[len-1-i] != s[i]-32){
				ret=1;
				break;
			}
		}else if((s[i]>='A'&& s[i]<='Z')){
			if(s[len-1-i] != s[i]+32){
				ret=1;
				break;
			}
		} 
		else if(s[i] != s[len-1-i]){
			ret=1;
			break;
		}

思考了一下还是取余更为精妙(不必判断是大写还是小写,也不必判断自身是否在字符串的中心位置)

    if((s[i]>='a' && s[i]<='z') || (s[i]>='A'&& s[i]<='Z')){
        if((s[len-1-i]-s[i])%32){
            ret=1;
            break;
        }     
    }else if(s[i] != s[len-1-i]){
        ret=1;
        break;
    }

代码如下:

#include<stdio.h>
#include<string.h>

int main()
{
	char s[1000];
	scanf("%s", s);
	
	int len = strlen(s)-1;
	int ret = 0;
	for(int i=0; i<=len/2; i++)
	{
		if((s[i]>='a' && s[i]<='z') || (s[i]>='A'&& s[i]<='Z')){
			if((s[len-1-i]-s[i])%32){
				ret=1;
				break;
			}
		}else if(s[i] != s[len-1-i]){
			ret=1;
			break;
		}
	}
	if(ret) printf("NO");
	else printf("YES");
	return 0;
}

原文地址:https://www.cnblogs.com/Knight02/p/15799061.html