外星人比数的大小

描述: 
来自星星的都教授除了所有感官比地球人高出七倍,始终容颜不老以外,还拥有一项在地球人看来特别神奇的能力,他会瞬间(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\n");
26         else
27             printf("%d\n", (cnt1 > cnt2) ? num1 : num2);
28     }else{
29         printf("-1\n");
30     }
31
32     return 0;
33 }
时间: 2024-08-04 02:14:13

外星人比数的大小的相关文章

用指针比较两数的大小(2)

指针的基本操作(2) 下面的程序,输入10 100和100 10,均可以输出max=100 min=10,请补充完整程序 #include <iostream> using namespace std; int main( ) { int *p1,*p2,t; //本程序以下不准再加入新的变量,下面用new操作符分配空间,并用p1.p2分别保存其地址 //下面输入两个整数.若无上面分配的空间,这样操作指赂的空间,极其危险 cin>>*p1>>*p2; //下面加入的代码

统计数据库中的表记录数与大小

SqlServer中: USE DBNAME; GO exec sp_MSForEachTable @precommand=N'create table ##( 表名 sysname, 记录数 int, 保留空间 Nvarchar(10), 使用空间 varchar(10), 索引使用空间 varchar(10), 未用空间 varchar(10))', @command1=N'insert ## exec sp_spaceused ''?''', @postcommand=N'select *

使用dmidecode查看内存条数和大小及频率

1.内存的插槽总数及已使用的: dmidecode |grep -P -A 5 "Memory Device"|grep Size|grep -v 'Range' 2.支持最大的内存容量: dmidecode |grep "Maximum Capacity" 3.查看内存频率: dmidecode |grep "Speed"

查询数据库中所有表的记录数和大小

if exists ( select  *            from    dbo.sysobjects            where   id = object_id(N'[dbo].[TableSpace]')                    and objectproperty(id, N'IsUserTable') = 1 )     drop table [dbo].[TableSpace]gocreate table TableSpace    (      Tabl

第六届华为创新杯编程大赛第二轮(2014.4.29)

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

实现大小端之间的转换宏,包括32位和64位的数

这里利用汇编的思想 思路:1.大端转换为小端模式就将大端的高位和低位的值进行交换,先将高位清零然后右移到低位,低位清零左移到高位,然后两者再进行或(|)运算,就得到小端模式  2.小端转换为大端模式就将小端的高位和低位的值进行交换,先将高位清零然后左移到高位,低位清零右移到低位,然后两者再进行或(|)运算,就得到大端模式 主要注意的是机器的位数:决定了移位数以及清零时高低位所使用的数的大小和位数 大端转换成小端模式: 32位: #define swap32Big2Little(x)    (  

【贪心】超级波浪数- 10045

[贪心]超级波浪数- 10045 Time Limit: 1000MS Memory Limit: 32768KB 波 浪数,数的大小关系就象波浪,如“14352”我们从左向右看时数的大小由小到大,然后到小,再到大,再到小,当然14253.14352.24153. 24351.34152.34251.212.121也是波浪数,但122不是波浪数,112,1221也不是波浪数,现在有一个很大的数,我们想从中选 一些数出来,组成一个波浪数,由于数很大,我们叫它超级波浪数.给定一个数,请从中选一个最长

SQL的单个表的大小限制最大可以是多大?

第一个表说明对于所有 Microsoft® SQL Server™ 2000 版本都相同的最大容量.第二个和第三个表说明因 SQL Server 2000 的版本和操作系统的不同而异的容量. 下表说明在 Microsoft SQL Server 数据库中定义的,或在 Transact-SQL 语句中引用的各种对象的最大值(数量或大小).下表不包含 Microsoft® SQL Server 2000™ Windows® CE 版. 最大值(数量或大小) 对象 SQL Server 7.0 SQL

有符号数和无符号数负数(转)

有符号数和无符号数负数 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切.再者,用"补码"表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算.却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高