代码在数据较少的时候运行正确,在多组数据的时候会出错

img

#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;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632