class="markdown_views prism-kimbie-light">
题目链接:
1^1 + 2^2 + 3^3 + … + 1000^1000 结果的后十位数
solve0
用的是Java中的大数运行直接求出结果,再取后十位
solve1
对每个i^i对10000000000求模,所有的模求和,这样还要对10000000000求模,因为第一次模的和超过了10位数,所有不是程序错了,而是一个很小的问题你没有注意
solve2
是根据模幂运算,速度很快的
参见资料:
Java 代码:
package projecteuler41to50;
import java.math.BigInteger;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
class level48{
void solve0(){
BigInteger result=new BigInteger("0");
for(int i=1;i<=1000;i++){
String str=String.valueOf(i);
BigInteger num=new BigInteger(str);
num=num.pow(i);
result=result.add(num);
}
String resultStr=result.toString();
System.out.println(resultStr.substring(resultStr.length()-10));
}
void solve1(){
long result=0;
long modulus=10000000000l;
for(int i=1;i<=1000;i++){
long subresult=PowMod(i,i,modulus);
result=result+subresult;
}
System.out.println(result%modulus);
}
long PowMod(int base,int exponent,long modulus){
long res=base;
for(int i=2;i<=exponent;++i){
res=(res*base)%modulus;
}
return res;
}
void solve2(){
long result=0;
long modulus=10000000000l;
for(int i=1;i<=1000;i++){
long subresult=ModularExponentiation(i,i,modulus);
result=result+subresult;
}
System.out.println(result%modulus);
}
long ModularExponentiation(long base,long exponent,long modulus){
long result=1;
for(int i=1;i<=exponent;++i){
result=(result*base) % modulus;
}
return result;
}
}
public class Problem48 {
public static void main(String[] args){
Date beginTime=new Date();
new level48().solve1();
Date endTime=new Date();
long Time=endTime.getTime()-beginTime.getTime();
System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");
}
}
solve2的结果:
9110846700
Time:0s5ms
Python代码:
sum=0
for i in range(1,1001):
sum+=i**i
str(sum)[-10:]
纯暴力。。。