Project Euler – Problem 32

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.