题意:比较文件名的大小,其中非数字比较ASCII码,数字按照十进制数值比较
签到题坑了好久,原因是我想的策略是错的,我以为只要从第一个不同的开始计算数值就行了,但是1700A 和170A会被误判成一样的
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
string in[1010];
typedef long long LL;
int comp(string a, string b)
{
int lena = a.length();
int lenb = b.length();
int len = min(lena, lenb);
for(int i = 0; i < len; i++)
{
//if(a[i]==b[i] continue; //不应该加这句,不然1700和170会被判成一样的
if(isdigit(a[i]) && isdigit(b[i])) //两个都是数字需要补
{
LL n1 = 0, n2 = 0;
int k1=i,k2=i;
while(isdigit(a[k1])&&k1<lena) {n1 = n1 * 10 + (a[k1] - '0');k1++;}
while(isdigit(b[k2])&&k2<lenb) {n2 = n2 * 10 + (b[k2] - '0');k2++;}
if(n1 < n2) return -1;
else if(n1 > n2) return 1;
i=k2;
}
else //并不是都是数字
{
if(a[i] < b[i]) return -1;
if(a[i] > b[i]) return 1;
}
} //到这里了肯定前面都一样
if(lena < lenb) return -1;
else if(lena > lenb) return 1;
else return 0;
}
int main()
{
int n;
cin >> n;
for(int i = 0; i <= n; i++)
cin >> in[i];
for(int i = 1; i <= n; i++)
{
int ret = comp(in[0], in[i]);
if(ret <= 0) cout << "+" << endl; //in[0]<in[i]
else if(ret > 0) cout << "-" << endl;
}
return 0;
}