题目链接
利用compare函数比较大小的结果构建cmp函数,再利用sort函数来排序即可;
#pragma warning(disable:4996);
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
using namespace std;
struct bign { //存储大整数
int d[10000];
int len;
bign() {
memset(d, 0, sizeof(d));
len = 0;
}
}buf[105];
int compare(bign a, bign b) {
if (a.len > b.len) return 1;//a大
else if (a.len < b.len)return -1;//a小
else {
for (int i = a.len - 1;i >= 0;i--) {
//从高位到低位比较;
if (a.d[i] > b.d[i])return 1;
else if (a.d[i] < b.d[i]) return -1;
}
return 0;
//所有位相等,两数相等;
}
}
bign change(char str[]) { //转换
bign a;
a.len = strlen(str);
for (int i = 0;i < a.len;i++) {
if (isdigit(str[a.len - 1 - i])) //0~9
a.d[i] = str[a.len - 1 - i] - '0';
else //A~Z
a.d[i] = str[a.len - 1 - i] - 'A' + 10;
}
return a;
}
bign divide(bign a, int m, int b, int& r) {
bign c;
c.len = a.len;
r = 0;
for (int i = a.len - 1;i >= 0;i--) {
r = r * m + a.d[i]; //因为是m进制的,所以乘上m
if (r < b) c.d[i] = 0;
else { //相当于除k取余吧
c.d[i] = r / b;
r %= b;
}
}
while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
c.len--; //消除高位的0
return c;
}
void print(bign a) {
for (int i = a.len - 1;i >= 0;i--) {
printf("%d", a.d[i]);
}
}
bool cmp(bign a, bign b) {
if (compare(a, b) == 1&& compare(a, b)==0) return false;
if (compare(a, b) == -1)return true;
}
int main()
{
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0;i < n;i++) {
getchar();//吸收回车;
char a[1000];
scanf("%s", a);
buf[i] = change(a);
}
sort(buf, buf + n, cmp);
for (int i = 0;i < n;i++) {
print(buf[i]);
printf("\n");
}
}
return 0;
}