项目Euler Q20的Java算法

时间:2016-02-18 05:30:52

标签: java algorithm

N!表示n X(n-1)X ... X 3 X 2 X 1

例如,10! = 10 X 9 X ... X 3 X 2 X 1 = 3628800,    和数字10中的数字之和!是3 + 6 + 2 + 8 + 8 + 0 + 0 =    27。

查找数字100中的数字总和!

import java.util.*;
class ProjectEuler_20{
    public static double factorial(double number){
        double num=1;
        for(int i=2;i<=number;i++){
            num=num*i;
            }
        return num;
        }
    public static void main(String args[]){
        double number=factorial(100);
        long num=(long)number;
        long sum=0;
        for(int i=0;num>0;i++){
            sum=sum+num%10;
            num=num/10;
            }
        System.out.println(sum);
        }
    }

为什么我总是得到Long.MAX_VALUE数字的总和?有没有办法接近真正的答案?

1 个答案:

答案 0 :(得分:0)

double无法准确地保存与100!一样大的数字 - 您必须使用BigInteger 准确地执行乘法。

这是一行java 8答案:

IntStream.range(1,101).mapToObj(String::valueOf).map(BigInteger::new)
  .reduce(BigInteger::multiply).get().toString().chars().map(i -> i - '0')
  .reduce((i,j) -> i + j).ifPresent(System.out::println);

输出:

648

fyi,100!93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000