对位运算符以及与运算符的使用
转载一下http://blog.csdn.net/senyelicone/article/details/52196039
在这到题中用到了与运算符与移位运算符。
需要注意的就是数据类型,需要用到长整型,如果是用左移的话,就更加需要注意
所有数据在内存中都是以二进制形式存放的,其中有一些位是 1,而另一些位是 0。
例如,整数 100 的二进制表示为 1100100,其中 1 的位数是 3;整数 15 的二进制表示为 1111,其中 1 的位数是 4;整数-15 的 64 位二进制表示为 1111111111111111111111111111111111111111111111111111111111110001,其中 1 的位数是 61。
现在有 N 个整数,要求按照 64 位二进制补码表示中 1 的位数从大到小进行排序。若两个数的二进制表示中 1 的位数相同,则按照数本身值由小到大排序。
例如:数 100,15,0,30,7,-15,100,-100 排序后的结果为 :
-15,-100,15,30,7,100,100,0。
Input
第 1 行:整数 T (1≤T≤10) 为问题数
第 2 行:第一个问题中的 N(1≤N≤10000)
第 3 行:N 个待排序的数 (-1018≤数≤1018),每两个数之间由一个空格分隔。
第 4 ∽T*2+1 行:后面问题的数据,格式与第一个问题相同。
Output
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),然后在一行中输出排序后的数。格式为:以一个空格分隔每两个数。最后一个数后面没有空格。
Examples
3 1 1234 5 100 15 0 30 7 10 1 1 3 4 5 6 -7 -8 1234567 10000000
case #0: 1234 case #1: 15 30 7 100 0 case #2: -7 -8 1234567 10000000 3 5 6 1 1 4
#include <stdlib.h>
#include <iostream>
void solve(); /* write function solve() to process one case of the problem */
using namespace std;
struct MyStruct
{
int n;
long long int numbers;
};
int cmp(const void *a, const void *b)
{
struct MyStruct d1, d2;
d1=*((struct MyStruct*)a);
d2 = *((struct MyStruct*)b);
if (d1.n != d2.n)
return d2.n - d1.n;
else {
if (d1.numbers > d2.numbers)return 1;
else return -1;
}
}
void solve() /* Define function solve() to process one case of the problem */
{
MyStruct data[10000];
int n;
cin >> n;
for (int i = 0; i <n; i++)
{
//int count = 0;
long long int d = 1;
data[i].n = 0;
cin >> data[i].numbers;
//long long int temp = data[i].numbers;
for (int j = 0; j < 64; j++)
{
if (data[i].numbers&d)
data[i].n++;
d = d << 1;
}
//data[i].n = count;
}
qsort(data, n, sizeof(data[0]), cmp);
for (int i = 0; i < n-1; i++)
{
cout << data[i].numbers<< ' ';
}
cout << data[n - 1].numbers<<endl;
}
void init() /* Define function init() to do global intialization if needed */
{
}
/******************************************************************************/
/* */
/* DON'T MODIFY main() function anyway! */
/* */
/******************************************************************************/
int main()
{
int i, t; init();
std::cin >> t;
for (i = 0; i<t; i++)
{
std::cout << "case #" << i << ":" << std::endl;
solve();
}
return 0;
}