Java中的阶乘

Java中的阶乘,java,factorial,Java,Factorial,我一直在为Java使用这个阶乘程序: public static long factorial(int a) { if(a<1) { return 1; } long result=1; long x=a; while(x>1) { result*=x; x--; } return result; } 公共静态长阶乘(int a){ 如

我一直在为Java使用这个阶乘程序:

public static long factorial(int a) {

    if(a<1) {
        return 1;
    }
    long result=1;
    long x=a;
    while(x>1) {
        result*=x;                     
        x--;
    }
    return result;
}
公共静态长阶乘(int a){
如果(a1){
结果*=x;
x--;
}
返回结果;
}
然而,它似乎“中断”并在25的阶乘后返回一个负数。它返回负数一段时间,然后只返回“0”


我做错了什么导致了这一点吗?

您的
long


改用
biginger

25!大于
Long.MAX_值
..

另一种不太简单且适用于非整数的方法是使用gamma函数的自然对数


如果您必须坚持使用此实现,我建议您研究备忘录。为什么要继续重新计算值?一旦你有了一个,就抓住它,在重复请求时就把它分发出去。

25!=155112100433309885984000000

Java中long的最大值是
2^63-1=9223372036854775807
()

25岁!大约是Java中long可以存储的最大值的1.7*10^6。改用
biginger

检查,我知道标题指的是一个整数,但原则代表int、long、double等

简言之,一个基本数据类型有一个最大值,当您遍历该值时,它将环绕并再次启动。如果你真的想让它变得极客化,学习二进制加法来完全理解它。

根据JLS,溢出(和下溢)是无声的,这就是为什么你的结果是“惊喜”的原因

你有两个选择:

  • 如果需要精确答案,请使用BigInteger
  • 如果不需要精确性,请使用
    double
    (即使这样也会溢出
    170!

您缺少的是:当有符号整数基元类型(如short、int、long)的增量超过其可以表示的有符号值时,它会尝试翻转其符号位,即最左边的位,该位仅用于指示数字的符号。符号位中的1表示负值。这种现象称为整数溢出

考虑一个虚构的3位有符号原始数据类型(为了比较,Java长为64位)。它可以表示-4到3之间的数字

3,一个3位数字所能代表的最大正值,如下所示:011

将1添加到011,得到:100(数字部分溢出到符号部分)

100的十进制版本是-4

但是,当您开始处理long的容量时,有很多数字需要计数,因此这里有一个快速的方法来确定由给定的非减量序列(在本例中为阶乘)定义的最大数:

这看起来应该是一个无限循环,但事实并非如此;最终,由于整数溢出,阶乘(n)将返回负数。 这将为您提供以下输出:

factorial of 1 can fit in a long!
factorial of 2 can fit in a long!
factorial of 3 can fit in a long!
factorial of 4 can fit in a long!
factorial of 5 can fit in a long!
factorial of 6 can fit in a long!
factorial of 7 can fit in a long!
factorial of 8 can fit in a long!
factorial of 9 can fit in a long!
factorial of 10 can fit in a long!
factorial of 11 can fit in a long!
factorial of 12 can fit in a long!
factorial of 13 can fit in a long!
factorial of 14 can fit in a long!
factorial of 15 can fit in a long!
factorial of 16 can fit in a long!
factorial of 17 can fit in a long!
factorial of 18 can fit in a long!
factorial of 19 can fit in a long!
factorial of 20 can fit in a long!

你知道最大数字和整数能容纳多少吗?这是你的家庭作业吗?这不是我的家庭作业,这是我有趣的工作:)(我是个极客)。我的家庭作业决不会像这样要求帮助。我不知道整数能容纳的最大数。我会在文档中查找它。我的不好,意思是长,但不管类型如何,原则都是成立的,检查一下,因为它很好地解释了会发生什么,可能重复的结果不会有帮助;它仍然会溢出。最终,但一个双人球会比一个长的球在那里停留更长的时间。而天然原木也会延迟它。对组合计算很有帮助:只需添加和减去自然日志。不错的页面,但过一会儿会让我头晕目眩!我在使用BigInteger时遇到了一些问题,我会在返回之前将long转换为BigInteger吗?@Toby-no,而不是
long result,您将得到
biginger结果result=result.multiply(biginger.valueOf(x))@Toby:不客气。
factorial of 1 can fit in a long!
factorial of 2 can fit in a long!
factorial of 3 can fit in a long!
factorial of 4 can fit in a long!
factorial of 5 can fit in a long!
factorial of 6 can fit in a long!
factorial of 7 can fit in a long!
factorial of 8 can fit in a long!
factorial of 9 can fit in a long!
factorial of 10 can fit in a long!
factorial of 11 can fit in a long!
factorial of 12 can fit in a long!
factorial of 13 can fit in a long!
factorial of 14 can fit in a long!
factorial of 15 can fit in a long!
factorial of 16 can fit in a long!
factorial of 17 can fit in a long!
factorial of 18 can fit in a long!
factorial of 19 can fit in a long!
factorial of 20 can fit in a long!