求一个数的阶乘且防止溢出

                                                     求一个数的阶乘且防止溢出

一、阶乘的定义

    一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。亦即n!=1×2×3×…×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

二、如何求一个数的阶乘

      1、递归方法

          我们首先想到的就是递归求一个数的阶乘       

public class Factorial {

    public static void main(String[] args) {
        System.out.println("int的最大值为" + Integer.MAX_VALUE);
        int n = 12;
        int factorialSum = factorialRecursion(n);
        System.out.println("factorialSum=" + factorialSum + ";n=" + n);
         }

    public static int factorialRecursion(int n) {
        if (n == 0 || n == 1) {
            return 1;
        } else {
            return n * factorialRecursion(n - 1);
        }
    }

       运行结果:

      《求一个数的阶乘且防止溢出》

上面递归求阶乘,简单,但是当求13的阶乘的时候,就超出了int整数的范围了。

   2.防止溢出求一个数的递归

public class Factorial {

    public static void main(String[] args) {
        System.out.println("int的最大值为" + Integer.MAX_VALUE);
        int n = 12;
        int factorialSum = factorialRecursion(n);
        System.out.println("factorialSum=" + factorialSum + ";n=" + n);

        factorialFun(12);
        factorialFun(13);
    }

    public static int factorialRecursion(int n) {
        if (n == 0 || n == 1) {
            return 1;
        } else {
            return n * factorialRecursion(n - 1);
        }
    }

    public static void factorialFun(int n) {
        int[] array = new int[10000];
        array[0] = 1;
        int bit = 1;//代表阶乘值的位数
        int carry = 0;
        int i, j, k;
        for (i = 2; i <= n; i++) {//for循环,相关于递归,先计算i!,再计算(i+1)!,直至计算到所求的n!
            for (j = 0; j < bit; j++) {
                array[j] = array[j] * i;
            }

            for (j = 0; j < bit - 1; j++) {//从最低位array[0]开始直到array[bit-2],判断每一位是否有进位,如果有,则进行进位操作
                carry = array[j] / 10;//向下一位进位的值
                array[j] = array[j] % 10;
                k = j;
                array[++k] += carry;//加上进位的结果,
            }
            if (array[bit - 1] >= 10) {//判断最高为array[bit-1]的值是否大于0,如果大于0则进行进位操作
                int temp = array[bit - 1] / 10;
                array[bit - 1] = array[bit - 1] % 10;
                while (temp != 0) {
                    array[bit] = temp % 10;
                    temp = temp / 10;
                    bit++;//将最高位的结果依次进位,并增加响应阶乘结果的位数
                }
            }

        }
        for (i = bit - 1; i >= 0; i--) {//输出最终的值,从最高位array[bit-1]开始,直到array[0]
            System.out.print(array[i]);
        }
        System.out.println(" ,n=" + n);
    }
}

   运行结果:

  《求一个数的阶乘且防止溢出》

  原理如下:
      《求一个数的阶乘且防止溢出》

点赞