Java 實(shí)現(xiàn)階乘算法
階乘算法如下:
以下列出 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
而當(dāng) n≥5 時(shí)儒将,n吏祸!的個(gè)位數(shù)字都是0。
java代碼實(shí)現(xiàn)
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("--------循環(huán)算法-------");
System.out.println(factorialLoop(25));
System.out.println("--------BigDecimal算法-------");
System.out.println(factorial(new BigDecimal(100)));
}
/**
* 遞歸實(shí)現(xiàn)階乘算法
*
* @param n
* @return
*/
public static long factorialRecursive(int n) {
// 階乘對(duì)整數(shù)才有意義
if (n < 0) {
return -1;
}
// 0钩蚊!=1贡翘,(0 的階乘是存在的)
if (n == 0) {
return 1;
}
if (n < 2)
return n * 1;
return n * factorialRecursive(n - 1);
}
/**
* 循環(huán)實(shí)現(xiàn)階乘算法
* @param n
* @return
*/
public static long factorialLoop(int n) {
// 階乘對(duì)整數(shù)才有意義
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;//結(jié)果集鸣驱,初值取1
while(n.compareTo(bd1) > 0){//參數(shù)大于1,進(jìn)入循環(huán)
result = result.multiply(n.multiply(n.subtract(bd1)));//實(shí)現(xiàn)result*(n*(n-1))
n = n.subtract(bd2);//n-2后繼續(xù)
}
return result;
}
}