2012-09-22 16:44:15Morris
[ZJ] a528. 大數排序
內容 :
排列數字一定很容易嗎
現在給你一堆數字
請你幫我排序
輸入說明
:
多筆測資
每筆測資第一行輸入一正整數N
皆下來的N行每行有一個整數Xi (1 <= i <= N)
(0 < N < 1000, | Xi | < 10100)
輸出說明
:
將排序好的數字由小到大分行輸出
範例如下
範例輸入 :
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;
}
#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;
}