N的阶乘算法(能计算到100000)
2010-01-22 12:23
316 查看
也许计算阶乘,大家都会想到用递归算法,
但是用递归算法的话,当数值在大于20时,就有很慢,同样内存也可能爆掉
现在我这个不是用递归来实现,而是采用了计算高位的方法。用数组来保存阶乘后的每一位。
如:
还有一种方法:
不过这种方法可能得不到正确的答案
还有另外一种方法:
第三种方法其实采用了Java里面的BigDecimal类来实现。
但是用递归算法的话,当数值在大于20时,就有很慢,同样内存也可能爆掉
现在我这个不是用递归来实现,而是采用了计算高位的方法。用数组来保存阶乘后的每一位。
如:
/** * 求N的阶乘 * * @param n * 0<=n<=100000 */ public static void fun(int n){ long []a = new long[100000]; int carry,j; int digit=1; // 位数 int temp,i; a[0]=1; for(i=2; i<=n; i++) { for(carry=0,j=1; j<=digit; ++j)// 循环计算 { temp=(int)(a[j-1]*i+carry);// 计算乘积 a[j-1]=temp%10; // 保存每一位 carry=temp/10; // 进位 } while(carry>0) { // digit++; a[++digit-1]=carry%10;// 保存高位 carry/=10; } } for(int k=digit; k>=1; --k){ System.out.print(a[k-1]); } System.out.println(); }
还有一种方法:
不过这种方法可能得不到正确的答案
public static void fun2(int n){ long sum=1; for(int i=2;i<=n;i++){ sum *=i; } System.out.println(sum); }
还有另外一种方法:
public static void fun3(int n){ BigDecimal sum = new BigDecimal("1"); for(int i=2;i<=n;i++){ sum = sum.multiply(new BigDecimal(String.valueOf(i))); } System.out.println(sum.toString()); }
第三种方法其实采用了Java里面的BigDecimal类来实现。
相关文章推荐
- 一个比较字符串和一个计算N个数字阶乘之和的算法
- WV.23-大数阶乘算法3-近似计算之一
- 算法 大数计算:加减乘除,模,阶乘,进制转换(大数除法取余)
- 请设计一个算法,计算n的阶乘有多少个尾随零。 给定一个int n,请返回n的阶乘的尾零个数。保证n为正整数
- WV.24-大数阶乘算法4-近似计算之二
- 算法学习十七----计算n的阶乘中0的个数
- 算法如功夫——C++ 用递归函数计算n的阶乘n!
- Java算法之递归算法计算阶乘
- 蓝桥杯练习系统VIP试题-算法提高-阶乘计算
- 算法系列—模拟手算,计算阶乘
- 写一个算法计算n的阶乘末尾0的个数
- 设计一个算法,计算出n阶乘中尾部零的个数
- 计算n阶乘中尾部零的个数--O(logN)算法
- 一种计算大数阶乘的算法
- 算法如功夫——C++ 用递归函数计算n的阶乘n!
- 一种计算大数阶乘的算法
- 计算阶乘的另一些有趣的算法(转载)
- WV.30-大数阶乘算法10-用Stirling逼近近似计算阶乘的探讨与应用
- 写一个算法计算n的阶乘末尾0的个数
- 计算阶乘的另一些有趣的算法