package test; import java.math.BigDecimal; //求n的阶乘 public class Factorial { public static BigDecimal one = new BigDecimal(1); //用 int或long 数字稍大就会溢出 public static int calculate(int n){ if(n==1) return 1; return n*calculate(n-1); } //这种方法BigDecimal能表达足够大的数字,但递归调用层次太深,最终会出现栈溢出 public static BigDecimal calculate(BigDecimal n){ if(n.equals(one)) return n; return n.multiply(calculate(n.subtract(one))); } //用BigDecimal 和非递归的方式可避免上述的两个问题 public static BigDecimal notRecursiveCalculate(BigDecimal n){ BigDecimal i = new BigDecimal(1); BigDecimal rs = new BigDecimal(1); for(; i.compareTo(n)<=0;i=i.add(one)){ rs=rs.multiply(i); } return rs; } /** * @param args */ public static void main(String[] args) { System.out.println(Factorial.calculate(11)); System.out.println(Factorial.calculate(new BigDecimal(1100)).toString()); System.out.println(Factorial.notRecursiveCalculate(new BigDecimal(5555)).toString()); } }