Pessoal,
estou com dificuldade de encontrar o erro no código. A intenção é que o código me desse o maior palíndromo da multiplicação de 2 números de 3 dígitos, mas consigo um resultado intermediário e não encontro o erro…
. Podem me ajudar? :
public class Palindrome {
public static void main(String[] args) {
int palindrome = 0;
int numberOne = 0;
int numberTwo = 0;
for (numberOne = 999; numberOne > 99; numberOne--) {
for (numberTwo = 999; numberTwo > numberOne; numberTwo--) {
int product = numberOne * numberTwo;
if (isPalindrome(product)) {
palindrome = product;
String text = "Largest Palindrome: %s x %s = %s";
System.out.printf(text, numberOne, numberTwo, palindrome);
break;
}
}
if (palindrome != 0) {
break;
}
}
}
static boolean isPalindrome(int number) {
int auxNumber = number;
int reversedNumber = 0;
while (auxNumber > 0) {
reversedNumber = reversedNumber * 10 + auxNumber % 10;
auxNumber /= 10;
}
return number == reversedNumber;
}
}
O que você tá fazendo é terminar o algoritmo no momento que encontrar o primeiro palíndromo, em vez de testar TODAS as possibilidades e, no final, ver qual é o maior palíndromo encontrado. Exemplo do que tava acontecendo:
....
....
924 x 929 = 858396
924 x 928 = 857472
924 x 927 = 856548
924 x 926 = 855624
924 x 925 = 854700
924 x 924 = 888888 // o programa termina aqui sendo que ainda falta milhões e milhões de multiplicações pra testar
Outro problema é a condição do segundo for numberTwo > numberOne. Dessa forma você só vai testar multiplicações em que o segundo fator (numberTwo) é maior que o primeiro (numberOne). Exemplo do que tava acontecendo:
....
....
994 x 999 = 993006 (tabuada do 994)
994 x 998 = 992012 (tabuada do 994)
994 x 997 = 991018 (tabuada do 994)
994 x 996 = 990024 (tabuada do 994)
994 x 995 = 989030 (tabuada do 994... ops, o numberTwo ficou maior que numberOne, vou para a próxima tabuada, 993)
993 x 999 = 992007 (tabuada do 993... sendo que ainda faltava 994 números pra testar na tabuada anterior)
Programa corrigido:
public static void main(String[] args) {
int largestPalindromeUntilNow = 0;
int largestPalindromeFactorA = 0;
int largestPalindromeFactorB = 0;
for (int numberOne = 999; numberOne > 99; numberOne--) {
for (int numberTwo = 999; numberTwo > 99; numberTwo--) {
int product = numberOne * numberTwo;
if (isPalindrome(product)) {
if (product > largestPalindromeUntilNow) {
largestPalindromeUntilNow = product;
largestPalindromeFactorA = numberOne;
largestPalindromeFactorB = numberTwo;
}
}
}
}
System.out.printf("Largest Palindrome: %s x %s = %s",
largestPalindromeFactorA, largestPalindromeFactorB, largestPalindromeUntilNow);
}
Qualquer linha de código que você não entendeu, por favor me avise 
E só mais uma coisa: esse seu método que verifica se é palíndromo está perfeitamente funcional, mas eu particularmente acho essa forma mais fácil de entender:
static boolean isPalindrome2(int number) {
String numberString = String.valueOf(number);
StringBuilder numberReversed = new StringBuilder(numberString).reverse();
return numberString.equals(numberReversed.toString());
}
Ela transforma em String e vê se o reverse() dela é igual a ela mesma. Mas isso é questão de gosto, apenas.
1 curtida
Obrigadoooo… Não estava enxergando esses erros…
Quanto a sua sugestão de um método que verifica o palíndromo pela String eu gostei.
