欧拉工程第48题:Self powers

欧拉工程第48题:Self powers_第1张图片
题目链接:
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:]

纯暴力。。。

你可能感兴趣的:(java,python,欧拉工程,欧拉工程-java)