【问题标题】:Summing BigInteger Digits对 BigInteger 数字求和
【发布时间】:2014-03-08 21:04:22
【问题描述】:

我正在尝试查找数字 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);
}

【问题讨论】:

    标签: java sum biginteger digits


    【解决方案1】:

    尝试使用 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);
    

    【讨论】:

    • 谢谢,我不知道我们可以这么简单地将 BigInteger 转换为 String。你是我认为最好的方式。但我仍然想知道 BigInteger 操作的问题。因为当我检查 2^10 和 2^15 时,我的代码给出了正确的结果。如果您有时间看看并与我分享您的评论,我会很高兴。
    • 您在计算的中间步骤中使用的 long 似乎已达到极限。在第 20 位之后,a.divide(b) 部分计算中的 ab 操作数停止更改。尝试进行调试,或打印出单个结果,您就会明白我的意思了。
    • 我绝对明白你的意思。感谢您的帮助。
    【解决方案2】:

    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() 之类的方式获取位数。

    【讨论】:

    • 非常感谢!它解决了这个问题。但这一次,我的算法似乎不正确,因为我得到了错误的答案。
    • @ÖzgürDevrimArikan 我将首先创建一些示例程序并创建一些明确的 BigInteger,其值类似于“1234”。然后尝试遍历这些数字,看看发生了什么。请记住,一旦您的 BigInteger 值为 2^1000,您就可以将其作为字符串获取(请参阅我的答案),然后循环遍历字符串的数字非常容易,并且有很多关于如何做的答案这个。
    猜你喜欢
    • 2023-03-16
    • 2011-10-13
    • 2014-07-20
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多