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=