Java 如何获取BigInteger中的第n个数字?

Java 如何获取BigInteger中的第n个数字?,java,biginteger,Java,Biginteger,我正在研究一些biginger问题,其中每个数字的大小为2^100。我需要这个数字的第n位我怎么做 使用toString()我将那个大整数转换成字符串,然后得到那个数字 但是字符串的大小只有Int的最大值 int get(BigInteger b,BigInteger n) { return Character.getNumericValue(b.toString().charAt(n.intValue())); } 因此,此代码仅在BigInteger小于Int max值时有效。 但在我

我正在研究一些
biginger
问题,其中每个数字的大小为2^100。我需要这个数字的第n位我怎么做

使用
toString()
我将那个大整数转换成字符串,然后得到那个数字 但是字符串的大小只有Int的最大值

int get(BigInteger b,BigInteger n)
{
  return Character.getNumericValue(b.toString().charAt(n.intValue()));
}
因此,此代码仅在BigInteger小于Int max值时有效。
但在我的例子中,在某些迭代之后,可能是我的BigInteger跨越了限制,所以如何才能在该BigInteger中获得第n个BigInteger数字?

您可以尝试使用BigInteger#toString并使用charAt(int i)。。。我为你写了一个测试:

@Test
void testBigInt(){
    BigInteger bi = new BigInteger("123456789012345678901234567890");
    System.out.println(bi.toString().charAt(25));
}
跑步时,我会得到一个“6”字。。。这似乎是对的

当您在“charAt()”中使用的位置整数太大(大于maxIntValue)时,您需要对原始的BigInteger进行模除

你可以“剪掉”第一个和最后一个数字,只看你感兴趣的范围

    @Test
public void testIt() {
    BigInteger bi = new BigInteger("1234567890");
    BigInteger resDiv = bi.divide(new BigInteger("100000"));
    System.out.println(resDiv.toString());
    BigInteger resMod = resDiv.mod(new BigInteger("1234"));

    System.out.println(resMod.toString());

}

您可以尝试使用biginger#toString并使用charAt(inti)。。。我为你写了一个测试:

@Test
void testBigInt(){
    BigInteger bi = new BigInteger("123456789012345678901234567890");
    System.out.println(bi.toString().charAt(25));
}
跑步时,我会得到一个“6”字。。。这似乎是对的

当您在“charAt()”中使用的位置整数太大(大于maxIntValue)时,您需要对原始的BigInteger进行模除

你可以“剪掉”第一个和最后一个数字,只看你感兴趣的范围

    @Test
public void testIt() {
    BigInteger bi = new BigInteger("1234567890");
    BigInteger resDiv = bi.divide(new BigInteger("100000"));
    System.out.println(resDiv.toString());
    BigInteger resMod = resDiv.mod(new BigInteger("1234"));

    System.out.println(resMod.toString());

}

你是怎么想到字符串只能代表最大值Int的数字的?或者你的意思是你有超过20亿个数字?不能重现你的问题。你能发布完整的代码吗?这是有效的:``导入java.math.biginger;公共类BigIntString{static int get(biginger b,biginger n){return Character.getNumericValue(b.toString().charAt(n.intValue());}公共静态void main(String[]args){biginger big=biginger.valueOf(Integer.MAX_VALUE);big=big.multiply(big)。multiply(big)。multiply(big)。multiply(big)。multiply(big);System.out.println(big.toString());int i=get(big,biginger.valueOf(5));System.out.println(i);}````阶乘(10000)少于40000位,远远低于Integer.MAX_值。或者
biginger n
是问题吗?真的超过20亿位数吗?字符串由字符数组备份(如果我理解文档的话),数组的索引只能是int,不能是long。所以你迷路了;-)您必须编写自己的toVeryLongString()方法,从二进制表示开始。我觉得您正在寻找一个您没有的问题的解决方案。您是如何想到字符串只能表示最大值为Int的数字的?或者你的意思是你有超过20亿个数字?不能重现你的问题。你能发布完整的代码吗?这是有效的:``导入java.math.biginger;公共类BigIntString{static int get(biginger b,biginger n){return Character.getNumericValue(b.toString().charAt(n.intValue());}公共静态void main(String[]args){biginger big=biginger.valueOf(Integer.MAX_VALUE);big=big.multiply(big)。multiply(big)。multiply(big)。multiply(big)。multiply(big);System.out.println(big.toString());int i=get(big,biginger.valueOf(5));System.out.println(i);}````阶乘(10000)少于40000位,远远低于Integer.MAX_值。或者
biginger n
是问题吗?真的超过20亿位数吗?字符串由字符数组备份(如果我理解文档的话),数组的索引只能是int,不能是long。所以你迷路了;-)您必须编写自己的toVeryLongString()方法,从二进制表示开始。我感觉您正在寻找一个您没有的问题的解决方案。我知道这一点,并且在我的代码中提到了这一点。charAt仅适用于最大整数值,之后它会引发异常。@AashishPawar不是,它不会。它表示该大小的
索引。只有当字符串大于
整数.MAX\u值时才会出现问题。那个么你们的数字是否超过20亿位数?(正如之前所问)哦。。。现在我明白了。。。charAt(Integer.maxValue()+1)顺便说一句,
2^100
base 10
位数仅约为
100/3.2
,因此使用提供的解决方案应该不会有任何问题。biginger b=factorial(10000);System.out.println(b.toString().charAt(Integer.MAX_VALUE));它抛出StringIndexOutOfBoundsException:字符串索引超出范围:2147483647我知道,我在代码中也提到了这一点。charAt仅适用于最大整数值,之后它会引发异常。@AashishPawar不是,它不会。它表示该大小的
索引。只有当字符串大于
整数.MAX\u值时才会出现问题。那个么你们的数字是否超过20亿位数?(正如之前所问)哦。。。现在我明白了。。。charAt(Integer.maxValue()+1)顺便说一句,
2^100
base 10
位数仅约为
100/3.2
,因此使用提供的解决方案应该不会有任何问题。biginger b=factorial(10000);System.out.println(b.toString().charAt(Integer.MAX_VALUE));它抛出StringIndexOutOfBoundsException:字符串索引超出范围:2147483647