请问各路大神(用java)100的阶乘的各个位数之和怎么求?比如10的阶乘是3628800,那我要求的结果是3+6+2+8+8+0+0=27,有没有那种不用算出100!而直接得出其各个位之和的方法,小弟在这谢过各位大神了

解决方案 »

  1.   

    提前算出N!写到数据库里0<=N<=X,用的时候直接取,找不到就现算然后存进去,额,这不是缓存么
      

  2.   

    long类型不够,double会丢失精度、、求围观。前面20个是,1,2,6,6,3,9,9,9,27,27;36,27,27,45,45,63,63,54,45,54.没看出来规律啊、、、
      

  3.   

    嗯,我也希望有大神能给我个解题思路,如果直接定义一个BigInteger类型的话倒是可以存进去100的阶乘,然后在计算各位之和,但总感觉这方法很笨,时间空间开销都挺大的
      

  4.   

    1W以内的阶乘还能接受,282ms,2W 1027ms,3W 2358ms,4W 4298ms,再往后就令人发指了
      

  5.   

    使用java.math.BigDecimal类,可以处理大数据
      

  6.   

    import java.math.BigInteger;public class Test_12 { public static void main(String[] args) {
    final BigInteger[] heap = new BigInteger[101];
    heap[0]=BigInteger.valueOf(1);
    for(int i=1;i<=100;i++){
    heap[i] = heap[i-1].multiply(BigInteger.valueOf(i));
    }
    String value = heap[100].toString();
    int sum = 0;
    for(int i=0;i<value.length();i++){
    sum += value.charAt(i)-'0';
    }
    System.out.println(sum);
    }
    }
    648
      

  7.   

    import java.util.Arrays;
    import java.util.Date;public class yelin2 {
    public static void main(String[] agrs){
    int[] s = new int[200];
    s[0]=1;
    int k,j,result,p=0,q,res=0;
    double stadate=System.nanoTime();
    for(k=2;k<=100;k++)
    {
    q=0;
    result=0;
    for(int i=0;i<200;i++)
    {
    result=s[i]*k+q;
    s[i]=result%10;
    q=result/10;
    if(q==0&&s[i+1]==0&&i>=p)
    {
    p=i;break;
    }
    }
    }
    System.out.println(Arrays.toString(s));
    for(j=0;j<200;j++)
    {
    res=s[j]+res;
    }

    System.out.println(res);
    double enddate=System.nanoTime();

    System.out.println(enddate-stadate);
    }    
    }
      

  8.   

    我觉得你想要的直接对数组操作的方法应该是指这个http://songyishan.iteye.com/blog/1026042
    把biginteger 里面的方法拆出来,效率应该能提升提升多少就不好说了
    还有你电脑啥配置?我用递归算1W的阶乘也只是427ms 是不是该考虑升级一下了