zzulioj1155: 字符串比较 多实例

题目描述
比较字符串大小,但比较的规则不同字典序规则。字符比较新规则如下:A < a < B < b < ………… < Z < z。

输入
输入数据包含多个测试实例,每个测试实例占两行,每一行有一个字符串(只包含大小写字母, 长度小于10000)。

输出
如果第一个字符串小于第二个,输出YES,否则,输出NO。
注意:A < a < B < b < ………… < Z < z。

样例输入 Copy
abc
Bbc
Ab
a
ABcef
ABce

样例输出 Copy
YES
YES
NO

代码一

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
	int i,j,len1,len2,f;
	char a[10000],b[10000];
	
	while(scanf("%s%s",a,b)!=EOF)
	{
		//求字符串长度 
		len1=strlen(a);
		len2=strlen(b);
		//将字符串a,b的每个字符转为相应的序号
		for(i=0;i<len1;i++)
		{
			if(islower(a[i]))  //a[i]为小写字母,ASCII码值变为相应的1、3、5...
				a[i]=(a[i]-'a')*2+1; 
			else
				a[i]=(a[i]-'A')*2;  //为大写字母,变为相应的偶数序号2,4,6... 
		 } 
		 
		 for(i=0;i<len2;i++)
		 {
		 	if(islower(b[i]))
		 		b[i]=(b[i]-'a')*2+1;
		 	else
		 		b[i]=(b[i]-'A')*2;
		 }
		 
		 f=strcmp(a,b);
		 if(f<0)  //f小于0,说明字符串a小于字符串b
		 	printf("YES\n");
		else
			printf("NO\n"); 
 	}
 	return 0;
}

说明
通过观察字符比较新规则如下:A < a < B < b < ………… < Z < z可以发现,新规则中一共有26*2=56个元素,其中,大写字母在其中的序号都为奇数,即1、3、5、…小写字母在其中的序号都为偶数,即2、4、6…,而字符比较其实比较的是他们的ASCII码值,因此可以利用循环,将数组a和数组b的ASCII码值变为它们在新规则中的序号值,这样就可以直接利用strcmp函数进行比较大小操作

其中,strcmp函数返回值:
大于0,表示字符串a大于字符串b
等于0,表示字符串a等于字符串b
小于0,表示字符串a小于字符串b

因此,当返回值小于0时,输出YES,否则的话输出NO

代码二

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	int i,len1,len2,len;
	char a[10000]={0},b[10000]={0};
	
	while(scanf("%s%s",a,b)!=EOF)
	{
		//求字符串长度 
		len1=strlen(a);
		len2=strlen(b);
		len=len1>len2?len1:len2;  //让len等于最大的长度值
		//如果两个字符串相等的话
		if(strcmp(a,b)==0)
			printf("NO\n");
		else
		{
			for(i=0;i<len;i++)
			{ 
				if(a[i]==b[i])   //如果两个字符相等,结束本次循环
					continue;
				else
				{
					//如果两个字符同时都为小写或者同时都为大写 
					if((islower(a[i])&&islower(b[i]))||(isupper(a[i])&&isupper(b[i])))
					{
						if(a[i]<b[i])   //两个字符都为大写或者小写时,字符a[i]小于字符b[i] 
						{
							printf("YES\n");
							break;
						}
						else
						{
							printf("NO\n");
							break;
						}
					}
					//a[i]为小写,b[i]为大写
					else if(islower(a[i])&&isupper(b[i]))
					{
						if(a[i]-32<b[i])
						{
							printf("YES\n");
							break;	
						}	
						else
						{
							printf("NO\n");
							break;
						}
					}
					//a[i]为大写,b[i]为小写
					else if(isupper(a[i])&&islower(b[i]))
					{
						if(a[i]+32<=b[i])
						{
							printf("YES\n");
							break;	
						}	
						else
						{
							printf("NO\n");
							break;
						}
					}	
					else
					{
						if(a[i]<b[i])
						{
							printf("YES\n");
							break;
						}
						else 
						{
							printf("NO\n");
							break;
						}
					}
				}	
			}	
		} 
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值