
正文
中南林业科技大学第十一届程序设计大赛 有趣的二进制 牛客网 java大数的一些方法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
链接:https://www.nowcoder.com/acm/contest/124/C
来源:牛客网
题目描述小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。输入描述:
有多组数据,每一行为一个数字n。
输出描述:
输出这个数字在二进制补码下1的个数。
输入例子:
15
输出例子:
4
-->
示例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 + ;
typedef unsigned long long ll;
int main() {
ios::sync_with_stdio(false);
ll n;
while( cin >> n ) {
ll cnt = ;
while( n ) {
if( n % == ) {
cnt ++;
}
n /= ;
}
cout << cnt << endl;
}
return ;
}
//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);
}
}
}
小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。
输入描述:
有多组数据,每一行为一个数字n。
输出描述:
输出这个数字在二进制补码下1的个数。
输入例子:
15
输出例子:
4
-->
示例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 + ;
typedef unsigned long long ll;
int main() {
ios::sync_with_stdio(false);
ll n;
while( cin >> n ) {
ll cnt = ;
while( n ) {
if( n % == ) {
cnt ++;
}
n /= ;
}
cout << cnt << endl;
}
return ;
}
//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);
}
}
}





