class ProjectEulerQ04 {
	private static int reverse(int n){
		int reversed = 0;
		while(n>0){
			reversed *= 10;
			reversed += n%10;
			n /= 10;
		}
		return reversed;
	}
	public static void method1(){
		//checks x*y where 1<x<=y<=999
		int max=0;
		int candidate;
		for(int x=1;x<=999;x++){
			for(int y=x;y<=999;y++){
				candidate = x*y;
				if(candidate == reverse(candidate)){
					if(candidate > max){
						max = candidate;
					}
				}
			}
		}
		System.
out.
println("Output: "+max
); 	}
	public static void method2(){
		//builds table of x*y, where 1 < y <= x <= 999
		boolean[] is_product = new boolean[1000000];
		for(int x=1;x<=999;x++){
			for(int y=1;y<=x;y++){
				is_product[x*y] = true;
			}
		}
		//checks all palindromes
		int max = 0;
		int power = 1;
		int temp1,temp2;
		for(int i=1;i<=999;i++){
			if(reverse(i) == 1){
				power *= 10;
			}
			temp1 = (i/10)*(power)+reverse(i);
			temp2 = i*(power)+reverse(i);
			if(is_product[temp1]){
				if(temp1 > max){
					max = temp1;
				}
			}
			if(is_product[temp2]){
				if(temp2 > max){
					max = temp2;
				}
			}
		}
		System.
out.
println("Output: "+max
); 	}
	public static void main
(String args
[]){ 		long start;
 
		System.
out.
println("Solve by checking each product:"); 		start 
= System.
currentTimeMillis();		method1();
		System.
out.
println("Time used: "+(System.
currentTimeMillis()-start
)+" ms");  
 
		System.
out.
println("Solve by checking each palindrome:"); 		start 
= System.
currentTimeMillis();		method2();
		System.
out.
println("Time used: "+(System.
currentTimeMillis()-start
)+" ms"); 	}
}
				Y2xhc3MgUHJvamVjdEV1bGVyUTA0IHsKCXByaXZhdGUgc3RhdGljIGludCByZXZlcnNlKGludCBuKXsKCQlpbnQgcmV2ZXJzZWQgPSAwOwoJCXdoaWxlKG4+MCl7CgkJCXJldmVyc2VkICo9IDEwOwoJCQlyZXZlcnNlZCArPSBuJTEwOwoJCQluIC89IDEwOwoJCX0KCQlyZXR1cm4gcmV2ZXJzZWQ7Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgbWV0aG9kMSgpewoJCS8vY2hlY2tzIHgqeSB3aGVyZSAxPHg8PXk8PTk5OQoJCWludCBtYXg9MDsKCQlpbnQgY2FuZGlkYXRlOwoJCWZvcihpbnQgeD0xO3g8PTk5OTt4KyspewoJCQlmb3IoaW50IHk9eDt5PD05OTk7eSsrKXsKCQkJCWNhbmRpZGF0ZSA9IHgqeTsKCQkJCWlmKGNhbmRpZGF0ZSA9PSByZXZlcnNlKGNhbmRpZGF0ZSkpewoJCQkJCWlmKGNhbmRpZGF0ZSA+IG1heCl7CgkJCQkJCW1heCA9IGNhbmRpZGF0ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIrbWF4KTsKCX0KCXB1YmxpYyBzdGF0aWMgdm9pZCBtZXRob2QyKCl7CgkJLy9idWlsZHMgdGFibGUgb2YgeCp5LCB3aGVyZSAxIDwgeSA8PSB4IDw9IDk5OQoJCWJvb2xlYW5bXSBpc19wcm9kdWN0ID0gbmV3IGJvb2xlYW5bMTAwMDAwMF07CgkJZm9yKGludCB4PTE7eDw9OTk5O3grKyl7CgkJCWZvcihpbnQgeT0xO3k8PXg7eSsrKXsKCQkJCWlzX3Byb2R1Y3RbeCp5XSA9IHRydWU7CgkJCX0KCQl9CgkJLy9jaGVja3MgYWxsIHBhbGluZHJvbWVzCgkJaW50IG1heCA9IDA7CgkJaW50IHBvd2VyID0gMTsKCQlpbnQgdGVtcDEsdGVtcDI7CgkJZm9yKGludCBpPTE7aTw9OTk5O2krKyl7CgkJCWlmKHJldmVyc2UoaSkgPT0gMSl7CgkJCQlwb3dlciAqPSAxMDsKCQkJfQoJCQl0ZW1wMSA9IChpLzEwKSoocG93ZXIpK3JldmVyc2UoaSk7CgkJCXRlbXAyID0gaSoocG93ZXIpK3JldmVyc2UoaSk7CgkJCWlmKGlzX3Byb2R1Y3RbdGVtcDFdKXsKCQkJCWlmKHRlbXAxID4gbWF4KXsKCQkJCQltYXggPSB0ZW1wMTsKCQkJCX0KCQkJfQoJCQlpZihpc19wcm9kdWN0W3RlbXAyXSl7CgkJCQlpZih0ZW1wMiA+IG1heCl7CgkJCQkJbWF4ID0gdGVtcDI7CgkJCQl9CgkJCX0KCQl9CgkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIrbWF4KTsKCX0KCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pewoJCWxvbmcgc3RhcnQ7CgkJCgkJU3lzdGVtLm91dC5wcmludGxuKCJTb2x2ZSBieSBjaGVja2luZyBlYWNoIHByb2R1Y3Q6Iik7CgkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQltZXRob2QxKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHVzZWQ6ICIrKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0KSsiIG1zIik7CgkJCgkJU3lzdGVtLm91dC5wcmludGxuKCk7CgkJCgkJU3lzdGVtLm91dC5wcmludGxuKCJTb2x2ZSBieSBjaGVja2luZyBlYWNoIHBhbGluZHJvbWU6Iik7CgkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQltZXRob2QyKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHVzZWQ6ICIrKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0KSsiIG1zIik7Cgl9Cn0=