#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
long long int t,n,j,i,NUM,k,A,q,r;
long long int e,z,w,x,b;
long long int a[10000],c[10000]; //数组 c按照1的位数大小排序,a放置具体数字
scanf("%lld",&t); //问题数
for(i=0;i<t;i++){
scanf("%lld",&n); //待排序的总数
for(j=0;j<n;j++){
scanf("%lld",&x); //具体数字 存入数组
a[j]=x;NUM=0;
for(k=0;k<=63;k++){ //与运算
b=1LL<<k;
A=x&b;
if(A)NUM++;
}
c[j]=NUM; //1的位数记入c数组
if(j==0);
else{ //开始排序
z=j-1;e=j;
while(c[e]>c[z] && z>=0){
q=c[e];w=a[e];
c[e]=c[z];c[z]=q;
a[e]=a[z];a[z]=w;
z--;e--;
} //按1位数大小进行排序
if(c[e]==c[z]){
if(a[e]<a[z]){
q=c[e];w=a[e];
c[e]=c[z];c[z]=q;
a[e]=a[z];a[z]=w;
} //按具体数字大小排序
}
}
}
if(n==1)printf("case #%lld:\n%lld\n",i,x);
else{
printf("case #%lld:\n",i);
for(r=0;r<n;r++){
printf("%lld ",a[r]);
}
printf("\n");
}
}
return 0;
}
在少量数据的情况下是正确的,但是多组数据却不正确
想请问是为什么
实质是求二进制表示中1的个数。
利用位运算来实现,每次将n和n-1做与运算,即把n二进制表示中最右边的1去掉。重复操作直到n变为0,操作次数即二进制中1的个数。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 10005;
LL num[maxn];
int getOneCount(LL a) //二进制中1的个数(正负数都适用)
{
int cnt = 0;
while (a != 0)
{
cnt++;
a &= (a-1); //去掉最右边的1
}
return cnt;
}
bool cmp(LL a, LL b) //按二进制中1的个数降序,相同时按值升序
{
int one_a = getOneCount(a), one_b = getOneCount(b);
return (one_a == one_b) ? (a < b) : (one_a > one_b);
}
int main()
{
int T, n;
cin >> T;
for (int kase = 0; kase < T; ++kase)
{
cin >> n;
for(int i = 0; i<n; ++i)
cin >> num[i];
sort(num, num+n, cmp); //自定义排序
cout << "case #" << kase << ':' << endl;
for(int i = 0; i < n-1; ++i)
cout << num[i] << ' ';
cout << num[n-1] << endl;
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!