总结BigInteger数字

时间:2014-03-08 21:04:23

标签: java sum biginteger digits

我试图找到数字2 ^ 1000的数字之和,我正在使用Java BigInteger类。但是,我无法做到这一点。最终,我得到一个0(零)与以下代码。可能是什么问题?

...谢谢


在Kon的帮助下我解决了问题,但这次我得到了错误的结果。任何人都可以看到算法的问题吗?

public static void main(String []args) throws Exception
{
    BigInteger big = BigInteger.valueOf(2).pow(1000);
    BigInteger big2 = BigInteger.valueOf(0);


    //System.out.println(big);

    for(long i = 1; i<283; i++)
    {
         big2 = big2.add(big.mod(BigInteger.valueOf((long) Math.pow(10,i))).divide(BigInteger.valueOf((long)Math.pow(10,i-1))));
    }

    System.out.println(big2);
}

2 个答案:

答案 0 :(得分:3)

尝试使用 mod 计算BigInteger的每个数字效率不高,因为您在此过程中进行了许多方法调用。相反,您可以通过转换为String并立即获取每个数字来简化。

BigInteger big = BigInteger.valueOf(2).pow(1000);
String digits = big.toString();
int sum = 0;

for(int i = 0; i < digits.length(); i++) {
    int digit = (int) (digits.charAt(i) - '0');
    sum = sum + digit;
}

System.out.println(sum);

答案 1 :(得分:1)

BigInteger类是不可变的,因此您必须将操作的结果分配给变量本身。

big2.add(big.mod(BigInteger.valueOf((long) Math.pow(10,i))).divide(BigInteger.valueOf((long)Math.pow(10,i-1))));

应该成为

big2 = big2.add(big.mod(BigInteger.valueOf((long) Math.pow(10,i))).divide(BigInteger.valueOf((long)Math.pow(10,i-1))));

有关Java中不可变对象的更多信息,请查看this documentation

此外,虽然您的问题并不是特别关注这一点,但在循环中使用硬编码的文字值是非常糟糕的做法。您想循环遍历BigInteger 2 ^ 1000中的每个数字。好吧,你可以使用像big.toString().length()这样的数字来获取数字。