首页投稿(暂停使用,暂停投稿)我是程序员;您好程先生;叫我序员就好了

Java 实现阶乘算法

2016-05-23  本文已影响1163人  康熙微博私访记

Java 实现阶乘算法

阶乘算法如下:

以下列出 0 至 20 的阶乘:

0!=1,(0 的阶乘是存在的)

1!=1,

2!=2,

3!=6,

4!=24,

5!=120,

6!=720,

7!=5040,

8!=40320

9!=362880

10!=3628800

11!=39916800

12!=479001600

13!=6227020800

14!=87178291200

15!=1307674368000

16!=20922789888000

17!=355687428096000

18!=6402373705728000

19!=121645100408832000

20!=2432902008176640000

而当 n≥5 时,n!的个位数字都是0。

java代码实现

package com.leo.kang.interview;
 
import java.math.BigDecimal;
 
public class Factorial {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("--------递归算法-------");
        System.out.println(factorialRecursive(20));
 
        System.out.println("--------循环算法-------");
        System.out.println(factorialLoop(25));
         
        System.out.println("--------BigDecimal算法-------");
        System.out.println(factorial(new BigDecimal(100)));
    }
 
    /**
     * 递归实现阶乘算法
     *
     * @param n
     * @return
     */
    public static long factorialRecursive(int n) {
        // 阶乘对整数才有意义
        if (n < 0) {
            return -1;
        }
 
        // 0!=1,(0 的阶乘是存在的)
        if (n == 0) {
            return 1;
        }
 
        if (n < 2)
            return n * 1;
        return n * factorialRecursive(n - 1);
    }
 
    /**
     * 循环实现阶乘算法
     * @param n
     * @return
     */
    public static long factorialLoop(int n) {
        // 阶乘对整数才有意义
        if (n < 0) {
            return -1;
        }
 
        // 0!=1,(0 的阶乘是存在的)
        if (n == 0) {
            return 1;
        }
 
        // 初始值必须为1才有意义
        long result = 1;
        for (int i = n; i > 0; i--) {
            result *= i;
        }
 
        return result;
    }
     
    public static BigDecimal factorial(BigDecimal n){ 
        BigDecimal bd1 = new BigDecimal(1);//BigDecimal类型的1 
        BigDecimal bd2 = new BigDecimal(2);//BigDecimal类型的2</span><span> 
        BigDecimal result = bd1;//结果集,初值取1 
        while(n.compareTo(bd1) > 0){//参数大于1,进入循环 
            result = result.multiply(n.multiply(n.subtract(bd1)));//实现result*(n*(n-1)) 
            n = n.subtract(bd2);//n-2后继续 
        } 
        return result; 
    }
 
}
上一篇 下一篇

猜你喜欢

热点阅读