Java Long类型阶乘计算-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java Long类型阶乘计算

2016-03-10 18:08:40 2235 1

问题描述:
n! <= 2^63-1 , 求最大的n.
问题:
如果不用java自带的 Long.MAX_VALUE,这个值,如何表示Long类型的最大值,我的表示方法为啥不对?
我的代码如何修改才能得到正确的值呢?(因为我观察到factorial这个变量从某一刻开始变成0,可能那个时刻就已经求到了最大的n? long类型的factorial范围不够用了?)
有什么优化的算法呢?

 /**
     * calculate the max value of n that n! < maxValueOf(Long)
     * long 8 bytes
     * @return max n
     */
    private static int findMax() {
        long maxLongValue = Long.MAX_VALUE;//(2<<(8*8-1))-1;
        System.out.println(maxLongValue);
        // n! <= 2^63-1, we recommend algorithm
        int n = 5;


        while(true){
            long factorial =n; //watch out here long
            int origin = n;
            while(n>1){
                factorial *= (n-1);
                n--;
            }
            System.out.println("--------" + factorial);
            n = origin;
            if((factorial+1) <= maxLongValue){
                n++;
                System.out.println("n="+ n +" factorial="+factorial);
            }else{
                n--;
                return n;
            }
        }
    }

结果

  /**
     * calculate the max value of n that n! < maxValueOf(Long)
     * long 8 bytes
     * @return max n
     */
    private static int findMax() {
        long maxLongValue = (1L<<(8*8-1))-1;
        System.out.println(maxLongValue);
        // n! <= 2^63-1, we recommend algorithm
        int n = 5;

        long lastFactorial = n;
        
        while(true) {
            if (n == 5) {
                long firstFactorial = n;//watch out here long
                int origin = n;
                while (n > 1) {
                    firstFactorial = firstFactorial * (n - 1);
                    n--;
                }
                lastFactorial = firstFactorial;
                n = origin + 1;
            } else {
                //we do worry about currentFactorial*(n-1) cus we never let a variable store it
                //in fact we have to worry about currentFactorial*(n-1)
                if (lastFactorial <= (maxLongValue/n)) {
                    if(n==17){
                        System.out.println("here---for debug only");
                    }
                    lastFactorial = lastFactorial * n;
                    n++;
                } else {
                    return n - 1;
                }
            }
        }
    }

结果n=20;

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:58:06

    (1L << 63)-1 注意必须写1L(long字面量), 不能写1(int字面量)
    每个long都一定不大于maxLongValue的, 所以不能用这个来判断溢出. 在已知n!没溢出时可以用(n+1)! / (n+1) == n!来判断.
    如果你只需要n (不要阶乘的精确值), 可以用斯特林公式求n!的近似. 但是因为这个搜索范围太小..未必比从1开始逐个算要快.

    0 0
相关问答

0

回答

请问如何对java中的HashSet集合中的大数据执行清除操作,有没有性能更快的做法?

2021-11-07 19:04:15 794浏览量 回答数 0

1

回答

Java性能调优,要对java ArrayList集合数据进行拆分处理,有没有性能最优的做法?

2021-11-07 19:06:27 739浏览量 回答数 1

0

回答

请问对java数组中的空值进行判断性能最优的做法是什么?

2021-11-12 17:13:07 110浏览量 回答数 0

0

回答

请问在java数组中提取指定数字性能最优的做法是什么?

2021-11-07 11:18:38 130浏览量 回答数 0

0

回答

请问对java数组中的某个元素移动性能最优的做法是什么?

2021-11-12 17:23:09 132浏览量 回答数 0

0

回答

请问在java数组中提取不重复的字符性能最优的做法是什么?

2021-11-07 11:18:48 133浏览量 回答数 0

0

回答

请问向java数组中填充字符串有没有性能最优的做法?

2021-11-07 11:19:06 139浏览量 回答数 0

0

回答

请问在java数组中搜索指定的字符有没有性能最优的做法?

2021-11-07 11:19:33 139浏览量 回答数 0

0

回答

请问获取java数组元素性能最快的做法是什么?

2021-11-07 11:24:07 141浏览量 回答数 0

0

回答

请问对java数组中的数据进行比较后并输出结果,考虑性能最优的做法是什么?

2021-11-07 11:24:13 136浏览量 回答数 0
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
文章
问答
问答排行榜
最热
最新
相关电子书
更多
Java基础入门(四)-泛型、反射、注解
立即下载
JAVA反射原理以及一些常见的应用
立即下载
Java开发手册1.2.0
立即下载