我试图找到数字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);
}
答案 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()
这样的数字来获取数字。