计算自我总和

时间:2014-10-26 03:58:43

标签: java

系列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);

这不会产生预期的结果。有谁可以指出错误?

4 个答案:

答案 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