题目:点击打开链接
这里比较麻烦的是,对于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);
}