3039. 按整数最高位的值排序
单点时限: 2.0 sec
内存限制: 256 MB
有 N 个整数 (整数−1018≤整数≤1018),要求按照整数十进制表示的最高位的值从大到小进行排序。若两个数的最高位的值相同,则按照数本身值由小到大排序。
例如:100,15,0,30,7,−15,100,−100,222222222233333333排序后的结果为 :
7,30,222222222233333333,−100,−15,15,100,0。
输入格式
第 1 行:整数 T (1≤T≤10) 为问题数
第 2 行:第一个问题中的 N(1≤N≤10000)
第 3 行:N 个待排序的整数 (整数−1018≤整数≤1018),每两个数之间由一个空格分隔
第 4 ~ 2*T+1 行:后面问题的数据,格式与第 1 个问题相同
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),然后在一行中输出排序后的数。格式:以一个空格分隔每两个数。最后一个数之后没有空格。
样例
input3 1 1234 5 100 -15 0 30 7 10 1 1 3 4 5 6 -7 -8 123456789012345678 10000000output
case #0: 1234 case #1: 7 30 -15 100 0 case #2: -8 -7 6 5 4 3 1 1 10000000 123456789012345678
#include <iostream> #include <string.h> using namespace std; long long a[10001]; int cmp(const void *a, const void *b) { long long *as = (long long *)a; long long *bs = (long long *)b; long long i = *as, j = *bs; while (i / 10) i /= 10; while (j / 10) j /= 10; if (i < 0) i = -i; if (j < 0) j = -j; if (i == j) return *as - *bs; else return j - i; } int main() { int t, i, cnt = 0; cin >> t; while (t--) { int n; cin >> n; for (i = 0; i < n; i++) cin >> a[i]; qsort(a, n, sizeof(a[0]), cmp); cout << "case #" << cnt++ << ":" << endl; for (i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; } return 0; } /*本来这道题都不怎么想写blog的,但是还是一眼拉跨,没能靠自己实现,因此简单写一些吧,这道题难点在大数字处理,想要简单过度\ 还是比较棘手的,本来以为longlong过不了,结果看了大佬的,好像可以用,才换回简单的思路来做 其实,这里取首位数字可以利用while /10来解决,负号的影响可直接除去,最后比较,我选了两种方式,i,j数值小直接减的,*aa则是用的比较 的方法*