参考: http://www.lxway.com/4044821961.htm
题目的意思有毒,有很多地方是要自己不断WA去摸索的,题意定义的排序是这样的:
1.小写字母按大写字母来处理;
2.若一个加减号在一个数字的前面,而不在一个数字的后面,那这个加减号表示正负;
3.一般字符按ASCⅡ码来处理。
因此对于每个输入的字符串要做的操作是:
1.数值为0的子字符串(0、00、+00、-0等等)全部删去;
2.表示数字的的子字符串,统一在前面加上加(减)号表示正(负);
3.小写字母全部转换成大写字母;
而比较时对应的比较方法是:
若是当前位置都是数字,比较数字大小;否则,若都是表示正负的加减号,减号优先;其余的情况,按照ASCⅡ码进行比较。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
bool issign(char s[], int i)
{
return (i == 0 || !isdigit(s[i - 1])) && (s[i] == '+' || s[i] == '-') && isdigit(s[i + 1]);
}
void formalize(char s[])
{
int i, j;
static char temp[1000];
for (i = 0, j = 0; i < strlen(s); i++, j++) {
if (isdigit(s[i])) {
if (i == 0 || (s[i - 1] != '+' && s[i - 1] != '-'))
temp[j++] = '+';
while (s[i] == '0')
i++;
while (isdigit(s[i]))
temp[j++] = s[i++];
if (temp[j - 1] == '+' || temp[j - 1] == '-')
j--;
}
temp[j] = (s[i] >= 'a' && s[i] <= 'z' ? s[i] - 32 : s[i]);
}
temp[j] = '\0';
strcpy(s, temp);
}
int cmp(char s1[], char s2[]) {
static int len1, len2;
formalize(s1);
formalize(s2);
for (int i = 1, j = 1; i < strlen(s1) && j < strlen(s2); i++, j++) {
if (isdigit(s1[i]) && isdigit(s2[j])) {
int k = i;
while (isdigit(s1[k]))
k++;
len1 = k - i;
k = j;
while (isdigit(s2[k]))
k++;
len2 = k - j;
if (len1 != len2)
return (len1 < len2 ? -1 : 1);
else {
while (i < k && j < k) {
if (s1[i++] != s2[j++])
return (s1[i] < s2[j] ? -1 : 1);
}
}
}
if (s1[i] != s2[j]) {
if (issign(s1, i) && issign(s2, j))
return (s1[i] == '-' ? -1 : 1);
return (s1[i] < s2[j] ? -1 : 1);
}
}
return 0;
}
int main()
{
int N, i;
char s1[1000], s2[1000];
cin >> N;
for (i = 1; i <= N; i++) {
scanf("%s%s", s1, s2);
cout << i << " " << cmp(s1, s2) << endl;
}
return 0;
}