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。
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;  
    } 

}

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。