private static HashSet<Double> f(int i) { if (S[i] != null) { return S[i]; } S[i] = new HashSet<Double>(); for (int x = 1; x < i; x++) { if ((x & i) == x) { for (Double temp : Fork(f(x), f(i - x))) { S[i].add(temp); // if (useFactorial) { // if (Math.abs(temp - (int) temp.doubleValue()) < 1E-6 // && temp > 0) { // S[i].add(new Double(factorial((int) temp // .doubleValue()))); // } // } } } } return S[i]; }
private static HashSet<Double> Fork(HashSet<Double> hashSet, HashSet<Double> hashSet2) { HashSet<Double> ret = new HashSet<Double>(); for (Double a : hashSet) { for (Double b : hashSet2) { ret.add(a + b); ret.add(a - b); ret.add(b - a); ret.add(a * b); if (b != 0) { ret.add(a / b); } if (a != 0) { ret.add(b / a); } } } return ret; }
private static int factorial(int x) { if (x < 0) { throw new IllegalArgumentException("x must be>=0"); } int fact = 1; for (int i = 2; i <= x; i++) { fact *= i; } return fact; }