2012-09-22 16:44:15Morris

[ZJ] a528. 大數排序

內容 :

排列數字一定很容易嗎

現在給你一堆數字

請你幫我排序 

輸入說明 :

多筆測資

每筆測資第一行輸入一正整數N

皆下來的N行每行有一個整數Xi (1 <= i <= N)

(0 < N < 1000, | Xi | < 10100

輸出說明 :

將排序好的數字由小到大分行輸出

範例如下 

範例輸入 :help

5
1
3
2
5
0
4
222222222222222222222222222
111111111111111
-44444444444444444444444444444444444444444444444444444
33333333333333333333333333333333333333333333

範例輸出 :

0
1 
2 
3 
5
-44444444444444444444444444444444444444444444444444444
111111111111111
222222222222222222222222222
33333333333333333333333333333333333333333333

提示 :

出處 :

(管理:d0789117)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[1000][105], sl[1000];
int a[1000];
bool cmp(int x, int y) {
    static int i;
    if(s[x][0] == '-') {
        if(s[y][0] != '-')    return true;
        if(sl[x] != sl[y])  return sl[x] > sl[y];
        for(i = 1; i < sl[x]; i++)
            if(s[x][i] != s[y][i])
                return s[x][i] > s[y][i];
        return false;
    }
    if(s[y][0] == '-')  return false;
    if(sl[x] != sl[y])  return sl[x] < sl[y];
    for(i = 0; i < sl[x]; i++)
        if(s[x][i] != s[y][i])
            return s[x][i] < s[y][i];
    return false;
}
int main() {
    int n, i;
    while(scanf("%d", &n) == 1) {
        for(i = 0; i < n; i++)
            scanf("%s", s[i]), a[i] = i, sl[i] = strlen(s[i]);
        sort(a, a+n, cmp);
        for(i = 0; i < n; i++)
            puts(s[a[i]]);
    }
    return 0;
}