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

Java Long类型阶乘计算

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

n! <= 2^63-1 , 求最大的n.

`````` /**
* 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;
}
}
}
}``````

• 蛮大人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

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

1

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

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

0

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

0

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

0

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

0

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

0

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

0

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

0

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

0

2021-11-07 11:24:13 136浏览量 回答数 0
+关注

Java基础入门(四)-泛型、反射、注解

JAVA反射原理以及一些常见的应用

Java开发手册1.2.0