这是一道二进制思维题;
将所有数字列成二进制形式,然后找出最大的一位“1”出现一次的位数;
然后把这个数提到前面,其他照常输出即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 int a[maxn]; 5 int cot[50]; 6 int main() 7 { 8 int n; 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 scanf("%d",&a[i]); 12 for(int i=1;i<=n;i++){ 13 int tmp=a[i]; 14 int num=0; 15 while(tmp){ 16 ++num; 17 if(tmp%2){ 18 cot[num]++; 19 } 20 tmp/=2; 21 } 22 } 23 int tt=40; 24 int biao=0; 25 while(tt){ 26 if(cot[tt]==1){ 27 biao=tt; 28 break; 29 } 30 tt--; 31 } 32 if(!biao){ 33 for(int i=1;i<=n;i++) 34 printf("%d ",a[i]); 35 printf("\n"); 36 return 0; 37 } 38 int flag; 39 for(int i=1;i<=n;i++){ 40 if((a[i]&(1<<(biao-1)))==(1<<(biao-1))){ 41 printf("%d ",a[i]); 42 flag=i; 43 break; 44 } 45 } 46 for(int i=1;i<=n;i++){ 47 if(i==flag) continue; 48 printf("%d ",a[i]); 49 } 50 printf("\n"); 51 return 0; 52 }