阶乘怎么计算
假如我要计算5的阶乘
那么结果就是
num = 5*4*3*2*1
第一种方案
@Test
public void test1(){
System.out.println("10阶乘 = " + f1(10));
}
/** 计算阶乘 **/
public double f1(double n1){
if (n1 == 1)return 1;
return n1*f1(n1-1);
}
一写出来阶乘的算法,很自然的就想到了递归
但是递归占用内存消耗实在是太大了
每进行一次计算都要重新开内存空间
所以这种方法趁早放弃吧
缺陷:内存消耗过大
第二种方案
其实 转换一点思维就好多了
接下来这个算法相当的简单
下面这个算法就相对于上一个消耗小多了
他的内存空间也就num k 和 i 这3个变量
@Test
public void test2(){
double num = 100;//要阶乘的数字
//---------------------------开始你的表演
double k = 1;
for (double i = 1; i<num ; i ++) {
k = k*i;
}
System.out.println(k);
}
缺陷:
算法没有什么问题
但是有问题的是变量的极限
第三种方案
这个方案基本上接近于 完美的方案
它是在第二种方案的基础上,扩大了数字极限
因此这种方案计算100000甚至以上的阶乘都没有问题
@Test
public void test3(){
int num = 10000;//要阶乘的数字
//------------------开始你的表演
BigDecimal bnum = new BigDecimal(String.valueOf(num));
BigDecimal k = new BigDecimal("1");
for (BigDecimal i = new BigDecimal("1"); i.max(bnum).equals(bnum) ; i = i.add(new BigDecimal("1"))) {
k = i.multiply(k);
}
//--------------------演出结束了
System.out.println(k);
}
这里就写一下10万的阶乘,究竟有多么可怕
用了12秒多世纪计算出来了10万的阶乘
害 我这个电脑可能是有点太老了
10万的阶乘是一个456575位的数字…
我这个电脑跑不起来100万了
有闲心的可以试试