您的位置:首页 > 其它

N的阶乘算法(能计算到100000)

2010-01-22 12:23 316 查看
也许计算阶乘,大家都会想到用递归算法,

但是用递归算法的话,当数值在大于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类来实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: