给定系列中最后10位数的总和

时间:2016-02-20 12:55:40

标签: java biginteger

输入包含整数N

该系列看起来像这样

enter image description here

这是hackerrank的一个问题,我的代码通过了所有测试用例,除了一个超时实际帮助得到赞赏

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
 public class Solution {
     public static BigInteger calculateSelfPowers(){
         Scanner z = new Scanner(System.in);
         int num = z.nextInt();
         BigInteger modval = BigInteger.valueOf(10).pow(10);
         BigInteger sum = BigInteger.ZERO;
         for (int i = 1; i <= num; i++)
         sum = sum.add(BigInteger.valueOf(i).modPow(BigInteger.valueOf(i), modval)).mod(modval);
         return sum;
     }
     public static void main(String[] args){
         System.out.println(calculateSelfPowers());
     }

 }

这是hackerrank linkhere

中的问题链接

1 个答案:

答案 0 :(得分:1)

您可以通过mod()退出循环并仅调用BigInteger.valueOf(i)一次来改进代码。增加是便宜的(快速),而mod()则不是。最终总和可能是16或17位数字,但您可以mod()一次获得与代码中mod()常数减少相同的结果。

这个简单的示例(我删除了扫描程序并获得允许的最高编号,999999)在我的系统上仅运行4秒钟:

package modpowtest;

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;

public class ModPowTest 
{
    public static BigInteger calculateSelfPowers()
    {
        int num = 999999;
        BigInteger modval = BigInteger.valueOf(10).pow(10);
        BigInteger sum = BigInteger.ZERO;
        for (int i = 1; i <= num; i++)
        {
            BigInteger bi = BigInteger.valueOf(i); 
            sum = sum.add(bi.modPow(bi, modval));
        }
        return sum.mod(modval);
    }

    public static void main(String[] args)
    {
        System.out.println(calculateSelfPowers());
    }

}

您只需再次添加Scanner内容并重命名为Solution

如果我使用num = 10;,我会得到与他们相同的解决方案。