题目要求如下:
需要对最大长度为1000的数进行排序。
主要解决思路,是将这个数字使用字符串的方式进行接收,然后将其转换为数字序列存储。
对于数字大小的比较,可以根据其长度进行判断。如果其中1个的长度大于第2个,那么第1个数字比较大,反之是第2个比较大。
如果2个数字长度相等,那么逐位进行比较,直到发现其中一位的值较大,那么即可返回结果。
下面是实现的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BigNumber {
int d[1001];
int len;
int r;
} bign;
bign change(char *str) {
bign a = {0};
a.len = strlen(str);
for (int i = 0; i < a.len; ++i) {
a.d[i] = str[a.len - i - 1] - '0';
}
return a;
}
int compare(bign a, bign b) {
// 大数大小比较
if (a.len > b.len) {
return 1;
} else if (a.len < b.len) {
return -1;
} else {
int n = 0;
for (int i = a.len - 1; i >= 0; --i) {
if (a.d[i] > b.d[i]) {
n = 1;
break;
} else if (a.d[i] < b.d[i]) {
n = -1;
break;
}
}
return n;
}
}
void print_bign(bign a) {
// 打印大数
for (int i = a.len - 1; i >= 0; --i) {
printf("%d", a.d[i]);
}
printf("\n");
}
int bign_compare(const void *p1, const void *p2) {
bign *a = (bign *) p1;
bign *b = (bign *) p2;
return compare(*a, *b);
}
int main() {
int num;
bign arr[100];
char b[1001] = {0};
while (scanf("%d", &num) != EOF) {
for (int i = 0; i < num; ++i) {
scanf("%s", b);
bign c = change(b);
arr[i] = c;
}
qsort(arr, num, sizeof(arr[0]), bign_compare);
for (int j = 0; j < num; ++j) {
print_bign(arr[j]);
}
}
return 0;
}
由于qsort可以直接对struct结构体进行比较,直接使用该函数进行比较。
最后是最终通过后的结果。