m0_63658942 2022-02-23 18:50 采纳率: 100%
浏览 25
已结题

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

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

在少量数据的情况下是正确的,但是多组数据却不正确

想请问是为什么

  • 写回答

2条回答 默认 最新

  • 关注

    实质是求二进制表示中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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月27日
  • 创建了问题 2月23日