Problem 32: Find the sum of all numbers that can be written as pandigital products.
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
class runner
{
public static class UnsignedBigInteger{
private List arr = new LinkedList();
private void _setup(double num){
Byte remainder = 0;
while(num > 0){
remainder = new Byte((byte) (num % 10));
arr.add(remainder);
num = (int)(num/10);
}
}
private void _setup(UnsignedBigInteger num){
for(int i=0; i 0 || neg){
arr = new LinkedList(); arr.add((byte) 0);
}
while(arr.size()>0 && arr.get(arr.size()-1) == 0){
arr.remove(arr.size()-1);
}
}
private void _power(UnsignedBigInteger arr2){
if(arr2.toString().equals("0")){
arr = new LinkedList(); arr.add((byte) 1);
return;
}
while(arr2.toString().length() > 1 || arr2.toString().charAt(0) - 48 != 1){
arr2.subtract(new UnsignedBigInteger(1));
UnsignedBigInteger original = this.clone();
this.add(original);
}
}
/*if x is bigger, return -1
*
*/
public int compareTo(UnsignedBigInteger x){
byte pull = 0; boolean neg = false;
UnsignedBigInteger tmp = new UnsignedBigInteger(this);
for(int a = 0; a 0 || neg)
return -1;
if(tmp.toString().length() == 1 || tmp.toString().charAt(0) - 48 == 0) return 0;
return 1;
}
private void _multiply(UnsignedBigInteger arr2){
if(arr2.toString().equals("0")){
arr = new LinkedList(); arr.add((byte) 0);
return;
}
UnsignedBigInteger original = this.clone();
UnsignedBigInteger counter = arr2.clone();
while(counter.toString().length() > 1 || counter.toString().charAt(0) - 48 != 1){
counter.subtract(new UnsignedBigInteger(1));
this.add(original);
}
}
private void _add(UnsignedBigInteger arr2){
byte carry = 0;
for(int n = 0; n 0){
while(carry > 0){
Byte remainder = new Byte((byte) (carry % 10));
arr.add(remainder);
carry = (byte) (carry/10);
}
}
}
public byte get(int i){
return arr.get(i);
}
public void set(int index, byte n){
n = (byte) (n % 10);
if(arr.size() <= index){
arr.add(n);
}else{
arr.set(index, n);
}
}
public int length(){
return arr.size();
}
public UnsignedBigInteger clone(){
return new UnsignedBigInteger(this);
}
public String toString(){
StringBuilder x = new StringBuilder();
for(int i = arr.size()-1; i>-1; i--){
byte y = arr.get(i);
x.append(y);
}
if(x.length() == 0) x.append(0);
return x.toString();
}
}
private static boolean removeFromSingular(HashSet singular, UnsignedBigInteger arr){
for(int i = arr.length()-1; i>-1; i--){
byte y = arr.get(i);
if(!singular.contains(y)) return false;
singular.remove(y);
}
return true;
}
@SuppressWarnings("unchecked")
public static void main (String[] args) throws java.lang.Exception
{
long time = System.currentTimeMillis();
UnsignedBigInteger sum = new UnsignedBigInteger(0);
HashSet answers = new HashSet();
HashSet singular_model = new HashSet();
for(byte i=1;i<10;i++){singular_model.add(i);}
UnsignedBigInteger max_limit = new UnsignedBigInteger(9999);
for(UnsignedBigInteger a= new UnsignedBigInteger(2); a.compareTo(max_limit) < 0; a.add(1)){
HashSet singular_a = (HashSet) singular_model.clone();
if(!removeFromSingular(singular_a, a)) continue;
UnsignedBigInteger b_start = new UnsignedBigInteger(100), b_end = new UnsignedBigInteger(1000);
if(a.length() == 1){
b_start = new UnsignedBigInteger(1000);
b_end = new UnsignedBigInteger(10000);
}
for(UnsignedBigInteger b= new UnsignedBigInteger(b_start); b.compareTo(b_end) < 0; b.add(1)){
HashSet singular_b = (HashSet) singular_a.clone();
if(!removeFromSingular(singular_b, b)) continue;
UnsignedBigInteger prod = new UnsignedBigInteger(a);
prod.multiply(b);
if(a.length() + b.length() + prod.length() < 9) continue;
if(a.length() + b.length() + prod.length() > 9) break;
if(!removeFromSingular(singular_b, prod)) continue;
if(answers.contains(prod.toString())) continue;
answers.add(prod.toString());
sum.add(prod);
System.out.println(a + " x "+ b + " = "+prod);
}
}
System.out.println(sum);
System.out.println("time: "+(System.currentTimeMillis() - time));
}
}
Note: Definitely not my best work.