系列1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317
,其中^
表示“对于权力”。
查找该系列的最后十位数字1^1 + 2^2 + 3^3 + ... + 1000^1000
。
BigInteger sum=BigInteger.ZERO;
for(int i=1;i<=1000;i++){
long pow=(long)Math.pow(i, i);
sum=sum.add(BigInteger.valueOf(pow));
System.out.println(sum);
}
System.out.println(sum);
这不会产生预期的结果。有谁可以指出错误?
答案 0 :(得分:1)
您可以使用BigInteger.pow()
来计算每个指数字词。但是,更好的方法是注意您只需要最终结果的最后10位数字。您可以使用%
运算符来帮助简化此计算。
答案 1 :(得分:1)
这应该可以解决问题:
BigInteger sum = BigInteger.ZERO;
BigInteger one = new BigInteger("1");
BigInteger count = new BigInteger("1");
for(int i=1; i<=1000; i++){
BigInteger pow = count.pow(i);
sum = sum.add(pow);
System.out.println(sum);
count = count.add(one);
}
System.out.println(sum);
你实际上让我想到了这一点。这个很难。谢谢!
答案 2 :(得分:1)
您的代码中的具体问题是您正在Math.pow
执行所有指数的计算,这只能用于双打。
BigInteger sum=BigInteger.ZERO;
for(int i=1;i<=1000;i++){
long pow=(long)Math.pow(i, i); // <-- All of the exponents calculated here
sum=sum.add(BigInteger.valueOf(pow)); // <-- Converted to BigInteger *after*
System.out.println(sum);
}
System.out.println(sum);
引用Math.pow
的文档(强调我的):
- 如果两个参数都是整数,那么结果完全等于将第一个参数提升到第二个参数的幂的数学结果,如果该结果实际上可以完全表示为double值。强>
可以用double表示的最大数字大约是~10 308 ,所以当你有150个术语时,这些Math.pow(i,i)
个调用中的任何一个都不会返回正确的价值。
由于这个是 Project Euler,我不打算发布一个完整的修补程序,但不用说,如果你计划实际计算每个术语,你需要做算术直接在BigIntegers上进行操作。
答案 3 :(得分:1)
它与其他人的反应相似但更短:
static String q48(){
BigInteger sum = new BigInteger("1");
for(int i=2;i<=1000;i++)
sum = sum.add(new BigInteger(i+"").pow(i));
return sum.toString().substring(sum.toString().length()-10);
}
// 9110846700