2017年大疆在线编程第一题
题目描述:
给出n(n<1000)个数,求任意两个数之间二进制表示的位数不同的数量之和。
PS:在考试的时候根本没有读懂这个题的意思。感觉换成这样的表述更合适:
求任意两个数的二进制表示之间不同位数的数量之和。
输入:
0<=n<32767。 输入首先为n,然后跟随着n个数,范围[0, 4294967295]
输出:
组合数量
样例输入:
2
9
15
样例输出:
2
分析一下:比较任意两个数的二进制之间不同的位数,就让这两个数按位异或,再去统计异或运算返回值的二进制表示中1的个数,求和输出。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.util.*; 2 3 public class dji1 4 { 5 public static void main(String[] args) 6 { 7 Scanner sc = new Scanner(System.in); 8 System.out.println("please input number:"); 9 int n = sc.nextInt(); 10 int[] arr = new int[n]; 11 while(sc.hasNext()){ 12 for (int j=0;j<n;j++ ) 13 { 14 arr[j]=sc.nextInt(); 15 } 16 } 17 18 19 int sum =0; 20 for (int i=0;i<n-1;i++ ) 21 { 22 for (int k=i+1;k<n;k++ ) 23 { 24 int tempInt = arr[i]^arr[k]; 25 sum += oneNums(tempInt); 26 } 27 } 28 29 System.out.println(sum); 30 31 } 32 33 public static int oneNums(int num){ //统计一个十进制数的二进制数中1的个数。 34 int count =0; 35 while(num!=0){ 36 int mod = num%2; 37 if (mod ==1) 38 { 39 count++; 40 } 41 num /= 2; 42 } 43 44 return count; 45 } 46 47 48 }