3 回答
TA贡献1828条经验 获得超13个赞
ABigInteger
可以转换为byte[]
using BigInteger.toByteArray()
。
请注意,在该示例中int
可以替换为。byte
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;
}
}
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());
添加回答
举报