输入包含整数N
该系列看起来像这样
这是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
中的问题链接答案 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;
,我会得到与他们相同的解决方案。