外星人比数的大小

描述: 
来自星星的都教授除了所有感官比地球人高出七倍,始终容颜不老以外,还拥有一项在地球人看来特别神奇的能力,他会瞬间(0.00000000001s以内)按照他的规则比较地球人熟悉的两个十进制数字的大小,他比较的规则如下:   
1、将要比较的两个数字分别转换成二进制数字;   
2、计算两个二进制数字中1的个数,个数多的数字为两者中的大者;   
3、负数按照其绝对值进行比较;   
请利用地球人发明的计算机程序逼近都教授的特异功能,实现时可以有以下约束:   
1、输入数据为范围在-32768到32768(地球人的十进制世界)之间的任意两个数字;   
2、如果经过比较后2个数相等,输出为0,如果不相等,输出最大值。如果输入非法,输出-1。

样例输入: -30 20
样例输出: -30

分析:实际上本题就是一个统计二进制数中1的个数问题,有很多方法,这里给出一种高效的方法。

 1 #include <stdio.h>
 2 #include <math.h>
 3 
 4 int one_count(unsigned int x)
 5 {
 6     int count = 0;
 7     while (x){
 8         count++;
 9         x = x & (x-1);
10     }
11 
12     return count;
13 }
14 
15 int main(void)
16 {
17     int num1, num2;
18     int cnt1, cnt2;
19 
20     if (scanf("%d %d", &num1, &num2) == 2){
21         cnt1 = one_count(abs(num1));
22         cnt2 = one_count(abs(num2));
23 
24         if (cnt1 == cnt2)
25             printf("0
");
26         else
27             printf("%d
", (cnt1 > cnt2) ? num1 : num2);
28     }else{
29         printf("-1
");
30     }
31 
32     return 0;
33 }
原文地址:https://www.cnblogs.com/xiaomanon/p/4468112.html