题意:给你一个标准字符串和 n 个字符串,若第 i 个字符串小于标准字符串则输出 - ,若大于等于则输出 + 。大小比较定义如下:
1):数字总是比字母小;
2):字母之间按字典序比较;
3):数字之间按大小比较(注意数字不是单个,例如X52Y ,则这个数字就是52而不是5 和 2 );
分析:略复杂的模拟题,方法不统一,注意细节就好。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[1000][15];
int a[15];
int b[15];
bool pd(char c)
{
if(c>='0'&&c<='9') return true; //数字
return false; //字母
}
void change(char s[],int len,int a[]) //记录字符串中的数字
{
for(int i=0;i<len;i++)
{
if(pd(s[i]))
{
int k=i,num=0;
while(k<len&&pd(s[k]))
{
num=num*10+s[k]-'0';
k++;
}
a[i]=num;
}
}
}
int count(int x)
{
int tot=0; while(x){x/=10;tot++;} return tot;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<=n;i++) scanf("%s",s[i]);
int len=strlen(s[0]);
change(s[0],len,a);
for(int i=1;i<=n;i++)
{
int len2=strlen(s[i]);
change(s[i],len2,b);
bool flag=false;
int head=0;
while(head<len&&head<len2)
{
int cnt1=pd(s[0][head]);
int cnt2=pd(s[i][head]);
if(cnt1==1&&cnt2==1) //同为数字
{
if(a[head]>b[head])
{
puts("-"); flag=true; break;
}
else if(a[head]<b[head])
{
puts("+"); flag=true; break;
}
else
{
head+=count(a[head]);
continue;
}
}
else if(cnt1==0&&cnt2==0) //同为字母
{
if(s[0][head]>s[i][head])
{
puts("-"); flag=true; break;
}
else if(s[0][head]<s[i][head])
{
puts("+"); flag=true; break;
}
else
{
head++;
continue;
}
}
else if(cnt1==1&&cnt2==0)
{
puts("+"); flag=true; break;
}
else
{
puts("-"); flag=true; break;
}
}
if(!flag) //比较到较短字符串的末尾了,完全一样。所有长度长的偏大。
{
if(len<=len2) puts("+");
else puts("-");
}
}
}