The problem requires one to find a product of two numbers such that the multiplicand/multiplier/product can be written as a 1 through 9 pandigital.
An example would be: 39 * 186 = 7254
Working with paper and a pencil, one can discover that the two form of solution are:
a * bbbb = cccc
aa * bbb = cccc
So all that was required to be done was generate all 9 digit permutations of 1-9 and then check if the arrangement satisfies any of the two cases mentioned above.
public class Problem_32<I extends Integer> {
public static void main(String[] args) {
System.out.println(new Problem_32<Integer>().computeSum());
}
public int computeSum() {
int sum = 1;
Set<Integer> products = new HashSet<Integer>();
Iterator<CombinatoricsVector<I>> permutationIterator = getPermutationGenerator();
while (!permutationIterator.isDone()) {
permutationIterator.next();
CombinatoricsVector<I> permutation = permutationIterator.getCurrentItem();
products.add(checkCaseA(permutation));
products.add(checkCaseB(permutation));
}
for (Integer i : products)
sum += i;
return sum;
}
/**
* Case A :: a x bbbb = cccc
*
* @return cccc if above equality holds, -1 otherwise
*/
private int checkCaseA(CombinatoricsVector<I> permutation) {
int a = permutation.getValue(0);
int b = get4Number(permutation, 1);
int c = get4Number(permutation, 5);
return a * b == c ? c : -1;
}
/**
* Case B :: aa x bbb = cccc
*
* @return cccc if above equality holds, -1 otherwise
*/
private int checkCaseB(CombinatoricsVector<I> permutation) {
int a = get2Number(permutation, 0);
int b = get3Number(permutation, 2);
int c = get4Number(permutation, 5);
return a * b == c ? c : -1;
}
private int get2Number(CombinatoricsVector<I> permutation, int startIdx) {
return permutation.getValue(startIdx) * 10 + permutation.getValue(startIdx + 1);
}
private int get3Number(CombinatoricsVector<I> permutation, int startIdx) {
return permutation.getValue(startIdx) * 100 + permutation.getValue(startIdx + 1) * 10
+ permutation.getValue(startIdx + 2);
}
private int get4Number(CombinatoricsVector<I> permutation, int startIdx) {
return permutation.getValue(startIdx) * 1000 + permutation.getValue(startIdx + 1) * 100
+ permutation.getValue(startIdx + 2) * 10 + permutation.getValue(startIdx + 3);
}
private Iterator<CombinatoricsVector<I>> getPermutationGenerator() {
ArrayList<I> array = new ArrayList<I>();
for (int i = 1; i < 10; i++)
array.add((I) new Integer(i));
Iterator<CombinatoricsVector<I>> permutationIterator = new PermutationGenerator<I>(new CombinatoricsVector<I>(
array)).createIterator();
permutationIterator.first();
return permutationIterator;
}
}
Popularity: 14% [?]
Related posts:
