Palíndromo - ajuda

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… :frowning:. 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 :slight_smile:


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.
:slight_smile: