链接:https://www.nowcoder.com/acm/contest/124/C
来源:牛客网
有多组数据,每一行为一个数字n。
输出这个数字在二进制补码下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); } } }
原文:https://www.cnblogs.com/l609929321/p/9144240.html