以文本方式查看主题

-  课外天地 李树青  (http://www.njcie.com/bbs/index.asp)
--  Java程序语言课件  (http://www.njcie.com/bbs/list.asp?boardid=17)
----  [原创]关于数据的阶乘计算效率低的问题解决方法  (http://www.njcie.com/bbs/dispbbs.asp?boardid=17&id=1026)

--  作者:qiuweiwei
--  发布时间:2011/3/30 15:18:23
--  [原创]关于数据的阶乘计算效率低的问题解决方法

关于老师上课讲的数据的阶乘计算效率低的问题,找了一个比较好的方法, 不过能计算的数最大为 9272  不过效率非常高,9272这个数的阶乘计算时间大约为1秒

贴下代码,有问题的话大伙一起讨论下,联系方法 qww_java@hotmail.com

 

package java_jichuzhishi_1;

import java.math.BigInteger;
import java.util.ArrayList;

public class Factorial4 {

 /*
  * 这个版本的程序使用了任意精度的整数 因此对于所能计算的值没有上限 他使用arraylist对象来缓存所计算出的值,而没有使用一个固定大小的数组
  * arraylist与数组很相似,但是arraylist可以任意扩展大小 factorial()方法声明为 同步,从而可以安全的用于多线程中
  */
 protected static ArrayList table = new ArrayList();// 创建缓存
 static {
  table.add(BigInteger.valueOf(1)); //初始化第1个数
 }

 // factorial()方法使用在一个arraylist中缓存的bigintger
 public static  synchronized BigInteger factorial(int x) {
  if (x < 0)
   throw new IllegalArgumentException("x must be non-negative");
  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);

 }
}
}

 

 

 

package java_jichuzhishi_1;

import java.io.*;

public class FactQuoter {

 /**
  * 程序将在用户交互式地输入值时显示出相应数的阶乘
  */
 public static void main(String[] args) throws IOException {
  // 从用户处读取文本行使用的方法
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  for (;;) {
   System.out.println("输入");
   // 从用户读取一行
   String line = in.readLine();
   // 如果到达文件结尾或者输入“quit”,退出
   if ((line == null) || line.equals("quit"))
    break;
   int x = Integer.parseInt(line);
   System.out.println(x + "!=" + Factorial4.factorial(x));
  }
 }

}

 

 


--  作者:admin
--  发布时间:2011/4/1 20:16:00
--  回复

这个练习很好,演示了一些处理大数据的类使用方法

 

事实上,传统的long整数只能算到66的阶乘

public static void main(String[] args) throws IOException {
                // 从用户处读取文本行使用的方法
                int n = 66;
                long result = 1;
                for (int i = 1; i < n; i++) {
                        result = result * i;
                }
                System.out.println(result);
        }

 

但是从性能来看,并没有优势,仍然采用传统的循环相乘方法,你觉得呢

[此贴子已经被作者于2011-04-01 20:19:17编辑过]