我想用java程序计算50的阶乘,而不使用数组

我想用java程序计算50的阶乘,而不使用数组,java,factorial,Java,Factorial,这是我的程序吗 `class Factorial { public static void main(String dt[]) { long n=50; long fact=1; if(n==0) { System.out.println("Factorial is 1"); } else if(n==1) { System.out.println("Factorial is 1"); } e

这是我的程序吗

`class Factorial
{
public static void main(String dt[])
{
    long n=50;
    long fact=1;
    if(n==0)
    {
        System.out.println("Factorial is 1");
    }
    else if(n==1)
    {
        System.out.println("Factorial is 1");
    }
    else
    {
        fact=n;
        while(n>1)
        {
            fact=fact*(n-1);
            n--;
        }
        System.out.print("Factorial is "+fact);
    }
}
}`

它不计算50的阶乘。我想在不使用数组和大整数的情况下计算它。

阶乘是一个快速增长到无穷大的数学函数,您的代码是错误的,因为使用的long短于该范围(到21!您已经有溢出)

您需要使用另一种数据类型,如大整数

使用BigInteger的重构方法如下所示:

private static void factorial(long n) {
    long x = n;
    BigInteger fact = BigInteger.ONE;
    if ((n == 0) || (n == 1)) {
        System.out.println("Factorial is 1");
    } else {
        fact = BigInteger.valueOf(n);
        while (n > 1) {
            fact = fact.multiply(BigInteger.valueOf(n - 1));
            n--;
        }
        System.out.println("Factorial of " + x + " is " + fact);
    }
}
注意21的输出!直到50岁!那可能是

21的阶乘为51090942171709440000

22的阶乘是11240007277607680000

23的阶乘为25852016738884976640000

24的阶乘是620448401733239439360000

25的阶乘是155112100433309885984000000

26的阶乘是4032914611260605684000000

27的阶乘是10888869450418352160768000000

28的阶乘为30488834461171386050150400000

29的阶乘是8841761993739701954543616000000

30的阶乘为26525285981219105863084800000000

31的阶乘是82228386541779228177255628800000

32的阶乘为263130836933693530167218012160000000

33的阶乘为86833176188118864955181944012800000000

34的阶乘是295232799039360414084761860943520000000

35的阶乘为103331479663861449296666513375232000000

36的阶乘是3719933267899012746799944815083520000000

37的阶乘是137637530912263450463159795815809024000000000

38的阶乘为523022617466601111760007224100074291200000000

39的阶乘为20397882081197443358640281739902897335680000000

40的阶乘是8159152832478973434561126959615894272000000

41的阶乘为334522613163807108170062053440751665152000000000

42的阶乘是1405006117752879898543142606244511569936384000000000

43的阶乘是604152630633738356373551320685139975072645120000000000

44的阶乘为26582715747884487680436281811014615890031963852800000000

45的阶乘为11962222086548019456196316149567715064383733760000000000

46的阶乘为550262215981208894985030542880025489296165175296000000000

47的阶乘为2586324151168180642964355153611979691976323891200000000000

48的阶乘是12413915592536072670862289047337503852148635467776000000000

49的阶乘为6082818640342675608722521332129537688755283179210240000000000

50的阶乘是3041409320171337804361260816606476884437764156896051200000000

publicstaticvoidmain(字符串[]args){
长n=50;
BigInteger事实=BigInteger.valueOf(1);

对于(int i=1;i程序的输出超过了长实例可以保存的最大值。因此,您可以使用java.math包的biginger来代替long,它可以容纳更大的值。

然后您必须实现自己的大整数,并使用一些数据结构来存储结果的数字(以及中间结果).a
long
可以容纳的最大值是9223372036854775807,但是
fact(50)
大约是
3E64
-因此变量溢出。请使用
float
biginger
      public static void main(String[] args) {

        long n=50;
        BigInteger fact= BigInteger.valueOf(1);

            for(int i=1;i<n-1;i++)
            {
                fact = fact.multiply(BigInteger.valueOf(n - 1));
            }
            System.out.print("Factorial is "+fact);
      }