其他分享
首页 > 其他分享> > EOJ 3039 按整数最高位的值排序个人错误分析

EOJ 3039 按整数最高位的值排序个人错误分析

作者:互联网

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: 等),然后在一行中输出排序后的数。格式:以一个空格分隔每两个数。最后一个数之后没有空格。

样例

input
3
1
1234
5
100 -15 0 30 7
10
1 1 3 4 5 6 -7 -8 123456789012345678 10000000
output
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则是用的比较
的方法*

 

 

标签:10,15,3039,EOJ,整数,long,100,排序
来源: https://www.cnblogs.com/emokable/p/15929266.html