Pra que fazer recursivo? Não precisa disso, dá pra ser bem mais simples:
public static int inverter(int n) {
int resultado = 0;
while (n > 0) {
resultado = 10 * resultado + n % 10;
n /= 10;
}
return resultado;
}
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
if ((i + inverter(i)) % 2 != 0) {
System.out.println(i);
}
}
}
Não dá pra entender se o for
precisa ir até 1000 ou 1 milhão. De qualquer forma, é só ajustar.
Vale notar que o número 10
também é impresso, afinal se invertê-lo ele se torna 01
, que numericamente falando é o mesmo que 1
. E portanto a soma é 11
, que é ímpar.
Outro detalhe é que tem muita redundância neste loop, pois se o for
estiver, por exemplo, no 36
, ele vai testar 36 + 63, e depois quando estiver no 63
, vai testar 63 + 36, ou seja, ele testa a mesma soma duas vezes.
Então ao testar o 36
, poderíamos já guardar o próprio 63
também, para que ele não seja testado novamente. Mas temos que nos atentar para casos especiais: por exemplo, se o número for 10
, o inverso é 1
, então o 10
deveria ser incluso. Mas o 1
não, porque o inverso dele também é 1
e soma dá 2
, que não é ímpar. Ou seja, o inverso só é incluso se o inverso dele for igual ao número original:
Set<Integer> set = new TreeSet<>();
for (int i = 0; i < 1000; i++) {
if (set.contains(i)) {
continue;
}
int inv = inverter(i);
if ((i + inv) % 2 != 0) {
set.add(i);
if (i == inverter(inv)) {
set.add(inv);
}
}
}
for (Integer i : set) {
System.out.println(i);
}
Não sei se o trabalho extra de calcular o inverso duas vezes e verificar toda hora se o número está no Set
compensa o cálculo redundante mencionado acima. Mas enfim…