用Java来实现一个数的阶乘

liuhao0720 2009-08-04 03:38:41
用Java来实现一个数的阶乘,怎么去实现呀?代码怎
么写呀?
...全文
2283 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanliang_xt 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bao110908 的回复:]
import java.math.BigInteger;

public class Test {

    public static void main(String[] args) {
        BigInteger x = factorial(30);
        System.out.println(x);
    }
   
    public static BigInteger factorial(int num) {
        if(num < 0) {
            throw new IllegalArgumentException("num must be signless integral.");
        }
        if(num < 2) {
            return BigInteger.ONE;
        }
       
        // 小于等于 16 时可以使用 int 进行计算
        if(num <= 16) {
            return intFractorial(num);
        }
       
        // 小于等于 20 时可以使用 long 进行计算
        if(num <= 20) {
            return longFractorial(num);
        }
       
        // 大于 20 时需要采用 BigInteger 进行计算
        return bigIntegerFactorial(num);
    }
   
    private static BigInteger intFractorial(int num) {
        int result = 1;
        while(num > 0) {
            result *= num--;
        }
        return BigInteger.valueOf(result);
    }
   
    private static BigInteger longFractorial(int num) {
        long result = 1L;
        while(num > 0) {
            result *= num--;
        }
        return BigInteger.valueOf(result);
    }
   
    private static BigInteger bigIntegerFactorial(int num) {
        BigInteger result = longFractorial(20);
        while(num > 20) {
            result = result.multiply(BigInteger.valueOf(num--));
        }
        return result;
    }
}
[/Quote]

注意这里有一个小错误:

// 小于等于 16 时可以使用 int 进行计算
if(num <= 16) {
return intFractorial(num);
}

此处应为小于等于12才对
tq02ksu 2009-08-13
  • 打赏
  • 举报
回复
10000以内的数用啥算效率也差不多少, 如果说运算次数多的话做一个缓存更合理, 所以倒不如都用一样的BigInteger.
tq02ksu 2009-08-13
  • 打赏
  • 举报
回复
把10000以下的全都算好保存起来, 用的时候直接拿, 10000以上的现算.
保证有效率.
nihuajie05 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sunzerui 的回复:]
问题是大数怎么办?
问1000或10000的阶层怎么求?
怎么保存大数呢?
[/Quote]
Java 明明有支持的大数据类型,干吗还要自己去管理。我是没这个自信编写的代码与源码比拼的效率。
btq123 2009-08-10
  • 打赏
  • 举报
回复
火龍果的解法不錯。
kmkjwjf 2009-08-06
  • 打赏
  • 举报
回复
用数组存放。在C#专区有人给出了很详细的解答
KingWolfOfSky 2009-08-06
  • 打赏
  • 举报
回复
确实,
如果面试Java,火龙果的答案是正解
如果考算法,模拟大数计算是正解
sunzerui 2009-08-05
  • 打赏
  • 举报
回复
问题是大数怎么办?
问1000或10000的阶层怎么求?
怎么保存大数呢?
wym2005em 2009-08-04
  • 打赏
  • 举报
回复
好好学习
  • 打赏
  • 举报
回复
import java.math.BigInteger;

public class Test {

public static void main(String[] args) {
BigInteger x = factorial(30);
System.out.println(x);
}

public static BigInteger factorial(int num) {
if(num < 0) {
throw new IllegalArgumentException("num must be signless integral.");
}
if(num < 2) {
return BigInteger.ONE;
}

// 小于等于 16 时可以使用 int 进行计算
if(num <= 16) {
return intFractorial(num);
}

// 小于等于 20 时可以使用 long 进行计算
if(num <= 20) {
return longFractorial(num);
}

// 大于 20 时需要采用 BigInteger 进行计算
return bigIntegerFactorial(num);
}

private static BigInteger intFractorial(int num) {
int result = 1;
while(num > 0) {
result *= num--;
}
return BigInteger.valueOf(result);
}

private static BigInteger longFractorial(int num) {
long result = 1L;
while(num > 0) {
result *= num--;
}
return BigInteger.valueOf(result);
}

private static BigInteger bigIntegerFactorial(int num) {
BigInteger result = longFractorial(20);
while(num > 20) {
result = result.multiply(BigInteger.valueOf(num--));
}
return result;
}
}
zl3450341 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shiyiwan 的回复:]
Java codepublicclass A {publicstaticlong cal(int i){if (i==1)return1;elsereturn cal(i-1)* i;
}publicstaticvoid main(String[] argv){
System.out.println(A.cal(5));
}

}

总有人不好好做作业 +_+
[/Quote]

。。。总有人不好好做作业
冰思雨 2009-08-04
  • 打赏
  • 举报
回复
简单写两个
public static long cal(int n){
long result = 1;
for(int i=n;i>0;i--){
result *= i;
}
return result;
}

public static long cal(int n){
if(n==1)return 1;
return n*cal(n-1);
}
hn1232 2009-08-04
  • 打赏
  • 举报
回复
来个非递归的~

public class Factorial {

public static long getFactorial(int num){
long temp = 1;
for(int i=1;i<=num;i++){
temp *= i;
}
return temp;
}

public static void main(String[] args){
System.out.println(getFactorial(0));
System.out.println(getFactorial(5));
}
}
aa870816 2009-08-04
  • 打赏
  • 举报
回复
感觉还是非递归的好一点啊,如果数字比较大的话,递归方法会很慢的~~~
lidonghaihome 2009-08-04
  • 打赏
  • 举报
回复
不少i--,在调用cal的时候,传递的参数为i-1这里就直接进行了参数转换。
junyao100 2009-08-04
  • 打赏
  • 举报
回复
public class A {

public static long cal(int i){
if (i == 1)
return 1;
else
return cal(i-1) * i;
}

public static void main(String[] argv){
System.out.println(A.cal(5));
}

}
是不是在递归里面少了一个i--呢?请指教
junyao100 2009-08-04
  • 打赏
  • 举报
回复
不错,用的递归
straing 2009-08-04
  • 打赏
  • 举报
回复
package safe1;

import java.util.Scanner;

public class jiechen {
public static void main(String []arg){
int w=1;
/*
下面两行的功能是输出你所需要计算阶乘的数i
*/
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
for(int k=i;k>0;k--)
w=w*k;
System.out.println(w);
}

}
starc 2009-08-04
  • 打赏
  • 举报
回复
还是别忘了大数,此题考的是数据结构
marf_cn 2009-08-04
  • 打赏
  • 举报
回复
public static void main(String[] args) {
long i=1;
while(true){
Factorial4.factorial(5000).toString();
if(i%100==0){
System.out.println(i);
}

i++;
}

}
}
class Factorial4{
protected static ArrayList table = new ArrayList();
static{ table.add(BigInteger.valueOf(1));}

public static synchronized BigInteger factorial(int x){
for(int size=table.size();size<=x;size++){
BigInteger lastfact= (BigInteger)table.get(size-1);
BigInteger nextfact= lastfact.multiply(BigInteger.valueOf(size));
table.add(nextfact);
}
return (BigInteger) table.get(x);
}
加载更多回复(6)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧