中南林业科技大学第十一届程序设计大赛 有趣的二进制 牛客网 java大数的一些方法
链接:https://www.nowcoder.com/acm/contest/124/C
来源:牛客网
题目描述
小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。
输入描述:
有多组数据,每一行为一个数字n。
输出描述:
输出这个数字在二进制补码下1的个数。
示例1
输出
复制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); } } }
彼时当年少,莫负好时光。