题目描述
比较字符串大小,但比较的规则不同字典序规则。字符比较新规则如下: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;
}