中南林业科技大学第十一届程序设计大赛 有趣的二进制 牛客网 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);
        }
    }
}

 

posted on 2018-06-06 11:32  九月旧约  阅读(194)  评论(0编辑  收藏  举报

导航