fact.java

来自「java xml开发指南(初学者推荐)Java Xml 编程指南书籍源码」· Java 代码 · 共 60 行

JAVA
60
字号
package MyNa.utils;

import java.math.BigInteger;
import java.util.*;
public class Fact {

public BigInteger biV(int n){  // big-integer value conversion
  return BigInteger.valueOf(n);
}

public BigInteger fact1(int n){ // traditional recursive answer.
  if(n==0)return biV(1);
  return biV(n).multiply(fact1(n-1));
}

private static Fact instance=null; // the one and only class instance
private static int clients=0;           // how many are asking us?

private Hashtable cache=null;    // the cache for answers

private Fact(){init();}     // private constructor, only called once

private void init(){cache=new Hashtable();} // set up cache

static synchronized public Fact getInstance(){
  if(null==instance)instance=new Fact();
  clients++;
  return instance;
}
static synchronized public int freeInstance(){
  if(null==instance)return 0;
  clients--;
  if(clients==0)instance=null; // all gone, and the cache with it.
  return clients;
}

public BigInteger fact(int n){
  BigInteger biN=biV(n);
  BigInteger R=(BigInteger)cache.get(biN);
  if(null!=R)return R;
  if(n==0)return saveFact(biN,biV(1));
  return saveFact(biN,biN.multiply(fact(n-1)));
}

private synchronized BigInteger saveFact(BigInteger n,BigInteger fN){
  cache.put(n,fN);
  return fN;
}

public synchronized boolean freeSpace(int numToFree){
  Enumeration enum=cache.keys();
  while(enum.hasMoreElements() && numToFree>0){
    Object ob=enum.nextElement();
    cache.remove(ob);
    numToFree--;
    }
  return numToFree==0;
}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?