欧拉工程第48题:Self powers

2019-04-14 16:04发布

class="markdown_views prism-kimbie-light"> 48
题目链接
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+" "+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:] 纯暴力。。。