为什么java.Math.BigInteger在一定限制后出错?

时间:2013-08-14 21:30:28

标签: java biginteger

我试图打印2 ^ n中的数字总和,n = 1到1000。 这就是我所做的。

public static void main(String[] args) {
    int n = 1000;
    for (int i = 1; i < n; i++) {
        BigInteger power = BigInteger.valueOf((int)Math.pow(2, i));
        int sum = 0;
        while (power.intValue() > 0) {
            sum += power.intValue() % 10;
            power = power.divide(BigInteger.valueOf(10));
        }
        System.out.print(sum + "  ");
    }
}

它只能工作到大约2 ^ 30左右,然后打印相同的结果,46,其余部分。

我在C中使用“long long”尝试了类似的事情,并且在类似的限制之后打印了0。

根据答案,我改变了

BigInteger power = BigInteger.valueOf((int)Math.pow(2, i));

BigInteger power = BigInteger.valueOf(2).pow(i);

和46改为0.就像C. 仍然没有工作......

4 个答案:

答案 0 :(得分:7)

您正在使用Math.pow来生成应使用BigInteger函数执行此操作的值。

总和应存储在BigInteger中,而不是int。

答案 1 :(得分:7)

您正在进行整数运算,然后将其放入一个大整数。请改用biginteger pow方法。

答案 2 :(得分:4)

因为您没有使用BigInteger

使用BigInteger计算数字并不能让您神奇地将其总和存储在int中。

同样,将int传递给BigInteger.valueOf()并不会让int更大。

答案 3 :(得分:3)

您使用常规整数调用Math.pow(),而不是BigIntegers。你在整数文字上调用它。

你想要这个:

int i = 7; //or whatever power
BigInteger k = BigInteger.valueOf(2);
k = k.pow(i);