为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2023-04-13 15:42:36
我想计算任何给定数字的二进制数的集合位。但是给定数字的范围可以变化到 10^200。我尝试使用 BigInteger 并使用 num.toString(2); 将 bigInteger 转换为二进制字符串;但字符串的最大范围是 2^31。知道我还能在这里使用什么。
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

ABigInteger可以转换为byte[]using BigInteger.toByteArray()

请注意,在该示例中int可以替换为。byte


查看完整回答
反对 回复 2023-04-13
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

Stringin的最大范围Java是2^31 - 1正确的,但这与它可以容纳的数字的最大值无关,而是与它可以包含的字符数有关。


也就是说,您不需要 BigInteger 来查找数字中设置的位数(即使对于很大的数字),只需记住查找数字的二进制表示的方法即可。


前任:


2|12|0

2| 6|0

2| 3|1

2| 1|-

所以从上面我们知道12的二进制表示是1100。如果知道数字的二进制表示,我们可以很容易地计算出设置位数。


来到这个问题,你知道你不能处理那么大的数字,所以使用一个字符串来存储数字并执行上面的方法。


要划分存储在字符串中的数字,请从数字的开头部分开始划分,即十进制数的最高有效位。检查它是否向右传播一个进位,您可以通过一个简单的方式来做到这一点,&1它会告诉您这些数字的 LSB。最后,用 b 计算设置位的数量。


public class Expelliarmus{


    public static void main(String[] args) {

        String a = "9000000000000000000000000000000000000000000000000000000000000000000000000000000000000";//88 zeroes, you can test it for other numbers too

        System.out.println(fn(a,0L));

    }


    static long fn(String a, long b){ // Don't ask why I used long here

        if(a.length()==0) return b;

        if(a.length()==1 && a.charAt(0)=='1') return ++b;

        int n = Integer.parseInt(a.charAt(a.length()-1)+"");

        if((n&1)==1) ++b;

        a = divideMe(a);

        return fn(a,b);

    }


    static String divideMe(String a){

        int val = 0;

        String bb = "";

        for(int i=0;i<a.length();i++){

            int dup = 0;

            val = val*10 + Integer.parseInt(a.charAt(i)+"");

            if((val&1)==1) dup = 1;

            val = val/2;

            bb = bb + String.valueOf(val);

            val = dup;

        }

        if(bb.charAt(0)=='0') return bb.substring(1);

        return bb;

    }

}


查看完整回答
反对 回复 2023-04-13
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

bitCount()您可以使用以下方法:


    // So, we create a big number

    BigInteger num = new BigInteger("10");

    num = num.pow(200);


    System.out.println(num.bitCount());

只是为了好玩,您可以测试它是否为您提供了正确的数字:


    String binaryNum = num.toString(2);


    System.out.println(binaryNum);

    System.out.println(binaryNum.chars().filter(c -> c == '1').count());


查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信