天天看点

华师大 OJ 3036

题目:点击打开链接

这里比较麻烦的是,对于64位整数的输入输出在不同的编译器要用不同的方式。

总之gcc 用lld就通过了测试。

/******************************************************************************/
/*                                                                            */
/*  DON'T MODIFY main() function anyway!                                      */
/*                                                                            */
/******************************************************************************/

#include <stdio.h>
#include <stdlib.h>

struct data{
    long long int digitalValue;
    int countNum1;
};


void init(){}
void solve(); /* write function solve() to process one case of the problem    */

int main()
{  int i,t; init();
   scanf("%d\n",&t);
   for (i=0;i<t;i++)
   { printf("case #%d:\n",i);
     solve();
   }
   return 0;
}


//输入数据
//计算每个整数按照64位二进制补码表示中1的位数
//编写比较函数
//调用qsort函数进行排序
//输出

int cmp(const void *a, const void *b){
    struct data x;
    struct data y;
    x = *((struct data *)a);
    y = *((struct data *)b);
    if(y.countNum1 != x.countNum1)
        return y.countNum1 - x.countNum1;
    else {
        if(x.digitalValue > y.digitalValue) return 1;
        else return -1;
    }
}

void solve(){
    long long int d;
    int count;
    int n;
    struct data record[100000];
    int i,k;
    scanf("%d",&n);
    for(k=0;k < n;k++){
        scanf("%lld",&(record[k].digitalValue));
        d = 1;
        record[k].countNum1=0;
        for(i = 0;i<64;i++){
            if( d & record[k].digitalValue) record[k].countNum1++;
            d = d<<1;
        }
    }

    qsort(record,n,sizeof(record[0]),cmp);
    for(i = 0; i < n-1;i++){
        printf("%lld ",record[i].digitalValue);
    }
    printf("%lld\n",record[i].digitalValue);
}