博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中南林业科技大学第十一届程序设计大赛-C:有趣的二进制
阅读量:6239 次
发布时间:2019-06-22

本文共 1207 字,大约阅读时间需要 4 分钟。

链接:
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。

输入描述:

有多组数据,每一行为一个数字n。

输出描述:

输出这个数字在二进制补码下1的个数。
示例1

输入

15

输出

4

水题,直接移位运算就可以了,但是数据类型特别坑。

用long long定义时,对负数移位运算的时候会陷入-1的死循环中,从而TLE。

用unsigned long long定义,虽然unsigned long long的数据范围不包括负数,但是却可以以正数的形式储存负数,在位运算的时候直接对储存的整数移位运算。所以不会陷入死循环,TLE;也不需要对负数进行特判。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define INF 0x3f3f3f3fconst int maxn=1e6+10;using namespace std; int main(int argc, char const *argv[]){ //for (long long n; cin >> n ; cout << bitset<64>(n).count() << endl) {}百度了一下,发现可以直接用这个STL,一行代码解决问题QAQ unsigned ll n; while(~scanf("%lld",&n)) { int ans=0; if(n<0) { n=-1*n; ans++; } while(n) { if(n&1) ans++; n>>=1; } printf("%d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/Friends-A/p/9308987.html

你可能感兴趣的文章
ubuntu 删除旧内核
查看>>
TT/TC安装和简单使用
查看>>
Android利用drawable文件夹自定义控件背景、样式
查看>>
深入oracle 12c数据库备份与恢复(优化RMAN性能、Oracle flashback技术)
查看>>
【华为ACL】禁止某网段上网
查看>>
Linux启动的顺序说明
查看>>
5月15日
查看>>
DDoS***&防御[精品文章100篇]
查看>>
要学学好习一下mysql了
查看>>
linux 当路由器使用
查看>>
Exchange系列—配置传输规则
查看>>
1.3.1原文件声明规则
查看>>
Linux下搭建无人执守安装服务器
查看>>
第九节 三元操作符
查看>>
我的友情链接
查看>>
Win7新建Wifi热点(无工具版)
查看>>
IPPBX 2000 SIP 并发修改为一路
查看>>
修改Linux系统时间
查看>>
phalcon:使用路由和命名空间实现分组or模块化
查看>>
LVM Mirror Raid1管理
查看>>