猿问

我想计算任何给定数字的二进制数的集合位。但是给定数字的范围可以变化到 10^200

我想计算任何给定数字的二进制数的集合位。

但是给定数字的范围可以变化到 10^200。

我尝试使用 BigInteger 并使用 num.toString(2); 将 bigInteger 转换为二进制字符串;

但字符串的最大范围是 2^31。

知道我还能在这里使用什么。


一只萌萌小番薯
浏览 127回答 3
3回答

慕田峪7331174

ABigInteger可以转换为byte[]using BigInteger.toByteArray()。请注意,在该示例中int可以替换为。byte

杨__羊羊

Stringin的最大范围Java是2^31 - 1正确的,但这与它可以容纳的数字的最大值无关,而是与它可以包含的字符数有关。也就是说,您不需要 BigInteger 来查找数字中设置的位数(即使对于很大的数字),只需记住查找数字的二进制表示的方法即可。前任:2|12|02| 6|02| 3|12| 1|-所以从上面我们知道12的二进制表示是1100。如果知道数字的二进制表示,我们可以很容易地计算出设置位数。来到这个问题,你知道你不能处理那么大的数字,所以使用一个字符串来存储数字并执行上面的方法。要划分存储在字符串中的数字,请从数字的开头部分开始划分,即十进制数的最高有效位。检查它是否向右传播一个进位,您可以通过一个简单的方式来做到这一点,&1它会告诉您这些数字的 LSB。最后,用 b 计算设置位的数量。public class Expelliarmus{&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; String a = "9000000000000000000000000000000000000000000000000000000000000000000000000000000000000";//88 zeroes, you can test it for other numbers too&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(fn(a,0L));&nbsp; &nbsp; }&nbsp; &nbsp; static long fn(String a, long b){ // Don't ask why I used long here&nbsp; &nbsp; &nbsp; &nbsp; if(a.length()==0) return b;&nbsp; &nbsp; &nbsp; &nbsp; if(a.length()==1 && a.charAt(0)=='1') return ++b;&nbsp; &nbsp; &nbsp; &nbsp; int n = Integer.parseInt(a.charAt(a.length()-1)+"");&nbsp; &nbsp; &nbsp; &nbsp; if((n&1)==1) ++b;&nbsp; &nbsp; &nbsp; &nbsp; a = divideMe(a);&nbsp; &nbsp; &nbsp; &nbsp; return fn(a,b);&nbsp; &nbsp; }&nbsp; &nbsp; static String divideMe(String a){&nbsp; &nbsp; &nbsp; &nbsp; int val = 0;&nbsp; &nbsp; &nbsp; &nbsp; String bb = "";&nbsp; &nbsp; &nbsp; &nbsp; for(int i=0;i<a.length();i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int dup = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val = val*10 + Integer.parseInt(a.charAt(i)+"");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if((val&1)==1) dup = 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val = val/2;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bb = bb + String.valueOf(val);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val = dup;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if(bb.charAt(0)=='0') return bb.substring(1);&nbsp; &nbsp; &nbsp; &nbsp; return bb;&nbsp; &nbsp; }}

子衿沉夜

bitCount()您可以使用以下方法:&nbsp; &nbsp; // So, we create a big number&nbsp; &nbsp; BigInteger num = new BigInteger("10");&nbsp; &nbsp; num = num.pow(200);&nbsp; &nbsp; System.out.println(num.bitCount());只是为了好玩,您可以测试它是否为您提供了正确的数字:&nbsp; &nbsp; String binaryNum = num.toString(2);&nbsp; &nbsp; System.out.println(binaryNum);&nbsp; &nbsp; System.out.println(binaryNum.chars().filter(c -> c == '1').count());
随时随地看视频慕课网APP

相关分类

Java
我要回答