Dividir todos os elementos de um arraylist no Java

Olá pessoal, sou novo por aqui e to precisando de uma ajudinha.

eu consegui criar uma lista porém quero dividir todos os elementos desta lista mas não consigo manipular os dados da lista de nenhuma forma.

List myArrayList = new ArrayList();

	for (int x = 1; x <= 1000; x++)
    	myArrayList.add(x+x);

Não consigo fazer nada além deste ponto, alguém pode me dar uma luz?

Att,
Clayton

Explique melhor o objetivo. Esse código só está adicionando um monte de números em um arraylist, o que mais precisa ser feito além disso?

Abraço.

1 curtida

estou tentando solucionar um desafio, que vou deixar abaixo no final. Eu consigo gerar uma lista com todos esses números que é o primeiro objetivo, porém em seguida eu preciso inverter todos esses números da lista, eu criei um método para inverter numeros porém não sei como fazer um método que ao invés de receber apenas um numero ele receba uma lista inteira, que no caso seria essa primeira lista, o método para inverter que eu fiz é este.

int inverter(int n, int t) {
if (n == 0)
return t;
else return inverter (n / 10, t * 10 + n % 10);

para dar continuidade no desafio eu precisaria aplica esse método na lista gerada, no lugar de receber um “int n” teria que ser a lista e percorrer toda a lista.

Desafio completo.

Alguns números inteiros positivos n possuem uma propriedade na qual a soma de n + reverso(n) resultam em números ímpares. Por exemplo, 36 + 63 = 99 e 409 + 904 = 1313. Considere que n ou reverso(n) não podem começar com 0.

Existem 120 números reversíveis abaixo de 1000.

Construa um algoritmo que mostre na tela todos os números n onde a soma de n + reverso(n) resultem em números ímpares que estão abaixo de 1 milhão.

Neal.

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…

2 curtidas

Testei aqui mas está imprimindo os numeros pares.

E o que deveria imprimir então?

Vc disse: “mostre na tela todos os números n onde a soma de n + reverso(n) resultem em números ímpares”.

Repare que a soma de n com o inverso de n deve ser ímpar, mas o n pode muito bem ser par (como é o caso do 36, por exemplo - eu entendo que o 36 tem que ser impresso porque ele se encaixa no critério: 36 + 63 é 99, que é ímpar - não importa se 36 é par, a soma dele com o inverso é ímpar, portanto ele deve ser impresso).

Não era isso?

1 curtida

Ha claro, eu que interpretei o enunciado errado, estava buscado o resultado da soma dos numeros.

Brigadão pela ajuda!!!

Neal

Eu verifiquei que nos dois modelos de código eles está gerando a redundancia que vc mensionou, como isso poderia ser evitado?

Neal