面试题: 求 1*1! + 2*2! + 3*3! +...+ N*N! = ?

 

曾经做过的一道面试题:

分析:这道题目有两个隐藏问题

1. N!非常大,无法用普通的int或long类型来存储。

2. 对递归和非递归算法的转化与性能比较。

根据以上两点分别做如下对策:

1. N!非常大,但是Java中提供了专门用于处理大数据类型的类,BigInteger和BigDecimal,这两个类被经常用于金融计算,

完全将数据处理对象化。数据的计算调用对象的方法完成,拿BigDecimal举例如下:

BigDecimal bigone = new BigDecimal(“33.5”);

BigDecimal bigtwo = new BigDecimal(“35.6”);

bigone.add(bigtwo);   //加法

bigone.subtract(bigtwo);//减法

bigone.multiply(bigtwo);//乘法

bigone.divide(bigtwo);//除法,可带精度

bigone.compareTo(bigtwo);//比较,返回0,-1,1分别表示等于,小于,大于

这样,数据的操作完全是对象化的操作,进行精确处理后可以转化为基本类型。

代码如下:

package apistudy; import java.math.BigDecimal; public class JieCheng { public static void main(String[] args) { int num = Integer.parseInt(args[0]); System.out.println("递归算法"+num+"的阶乘= "+CalcJieCheng(num)); System.out.println("非递归算法"+num+"的阶乘= "+CalcJieCheng2(num)); System.out.println("1*1! + 2*2! + 3*3! +...+ N*N! ="+CalcSUM(num)); } // desc: 求N的阶乘,递归算法实现 public static BigDecimal CalcJieCheng(int n) { BigDecimal num = new BigDecimal(n); BigDecimal bd = null; if (n == 1 || n == 0) { bd = new BigDecimal(1); } else { bd = num.multiply(CalcJieCheng(n - 1)); //multiply乘法 } return bd; } //desc: 求N的阶乘,非递归算法实现 public static BigDecimal CalcJieCheng2(int n) { BigDecimal num = new BigDecimal(1); for (int i = 1; i <= n; i++) { num = num.multiply(new BigDecimal(i)); } return num; } //desc: 求N的阶乘并计算阶乘和 public static BigDecimal CalcSUM(int n) { BigDecimal bigDecimal = new BigDecimal(0); for (int i = 1; i <= n; i++) { bigDecimal = bigDecimal.add(CalcJieCheng(i).multiply(new BigDecimal(i))); //add加法 } return bigDecimal; } }  

运行:在Eclipse中点击Run--->Run as--->Run Configurations菜单在运行配置窗口Arguments选项卡输入要计算的值,比如50.

然后点击Run按钮,得到结果如下:

 

递归算法50的阶乘= 30414093201713378043612608166064768844377641568960512000000000000

非递归算法50的阶乘= 30414093201713378043612608166064768844377641568960512000000000000

1*1! + 2*2! + 3*3! +...+ N*N! =1551118753287382280224243016469303211063259720016986111999999999999

 

 

强悍吧,50的阶乘和就这么大的数字,想想用普通的long,int岂能存得下这强悍的结果。

你可能感兴趣的:(Java)