zoukankan      html  css  js  c++  java
  • 中南林业科技大学第十一届程序设计大赛 有趣的二进制 牛客网 java大数的一些方法

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

    题目描述

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

    输入描述:

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

    输出描述:

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

    输入

    复制
    15

    输出

    复制
    4

    开始自己做的时候读题目不仔细,以为题目没有给出数的取值范围,就当成大数来做了,然后几次wa。
    后来看别人的代码再仔细看题目发现这题目中有说是64位二进制所以直接用unsigned long long 就可以了。
    (看别人过的代码这题目好像不要考虑负数。。)
    贴一份c++的再贴两份java的(java的一些大数方法可以学)
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<map>
    #define debug(a) cout << #a << ": " << a << endl;
    using namespace std ;
    const int maxn = 1e4 + 20 ;
    typedef unsigned long long ll;
    int main() {
        ios::sync_with_stdio(false);
        ll n;
        while( cin >> n ) {
                ll cnt = 0;
                while( n ) {
                    if( n % 2 == 1 ) {
                        cnt ++;
                    }
                    n /= 2;
                }
                cout << cnt << endl;
        }
        return 0 ;
    }
    //Java
    import
    java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); while (cin.hasNextLong()) { long n = cin.nextLong(); System.out.println(Long.bitCount(n)); //可以这样计算二进制中1的个数 } } }
    import java.util.*;
    import java.math.*;
    public class Main {
        public static void main(String args[])
        {
            Scanner cin = new Scanner(System.in);
            BigInteger a,b,c,d;
            while(cin.hasNext())
            {
                a=cin.nextBigInteger();
                if(a.compareTo(BigInteger.valueOf(0))<0)
                {
                    a=(BigInteger.valueOf(2).pow(64)).add(a); //valueOf()将其他类型的值转换成大数
                }
                int s=0;
                while(a.compareTo(BigInteger.valueOf(0))>0) //大数比较大小,大于0返回1,等于返回0,小于返回-1
                {
                    BigInteger x=a.remainder(BigInteger.valueOf(2));//System.out.println(x);
                    if(x.compareTo(BigInteger.valueOf(1))==0)
                        s++;
                    a=a.divide(BigInteger.valueOf(2));
                }
                System.out.println(s);
            }
        }
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    深入学习 History 对象管理浏览器会话历史
    js用斜率判断鼠标进入div的四个方向
    致敬各位10年阿里的前端开发
    JavaScript 时间与日期处理实战:你肯定被坑过
    圣杯/双飞翼布局
    ES6入门
    Javascript中类式继承和原型式继承的实现方法和区别
    五十行javascript代码实现简单的双向数据绑定
    JavaScript 巧学巧用
    VUE2.0学习总结
  • 原文地址:https://www.cnblogs.com/l609929321/p/9144240.html
Copyright © 2011-2022 走看看