zoukankan      html  css  js  c++  java
  • 中南林业科技大学第十一届程序设计大赛-C:有趣的二进制

    链接:https://www.nowcoder.com/acm/contest/124/C
    来源:牛客网

    时间限制: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 <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <limits.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include<bits/stdc++.h>
    #define ll long long
    #define INF 0x3f3f3f3f
    const 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
    ",ans);
    	}
    	return 0;
    }
    

  • 相关阅读:
    12个JavaScript MVC框架评估 简单
    chrome developer tool 调试技巧 简单
    转CSS3线性渐变 简单
    base64:URL背景图片与web页面性能优化 简单
    转linux下apache安装gzip压缩 简单
    转思考什么时候使用Canvas 和SVG 简单
    转周报的逻辑 简单
    浏览器三种刷新方式采取的不同缓存机制 简单
    poj 1308 Is It A Tree? (并查集)
    poj 2912 Rochambeau (并查集+枚举)
  • 原文地址:https://www.cnblogs.com/Friends-A/p/9308987.html
Copyright © 2011-2022 走看看