Programa que identifica se o número é divisivel por 2 ,3 e 2, 3 ao mesmo tempo

[quote]Por gentileza, gostaria de uma ajuda, pois estou tendo dificuldades em criar um programa que liste de 200 a 300 os números divisiveis por 2, 3 e por doi e 3 ao mesmo tempo.
Eu pensei em criar um for
tipo : for (int i = 100; i <= 200; i++)
e 03 IF (else) testando se o valor é divisivel por 2 e tb por 3 em primeiro lugar, pois eu eu colocar primeiro apenas por dois ou por três ele não irá para o próximo teste, em relação ao teste IF a dúvida é como criar testando o resto da divisão, pensei em algo assim:

public static void main(String[] args) {
for (int i = 100; i <= 200; i++) {
if (((i%3)==0 && ((i%2))){
System.out.println("O valor de " + i + " é Divisivel por 2 e 3 ");

MAS esta acusando problema na sintaxe…

alguém pode me orientar em como proceder???

Grato.

olhando rapidamente,

if (((i%3)==0 && ((i%2))){

não falta um == 0 ali depois do (i%2) ?

Uma dica… os números divisíveis por 2 e 3 ao mesmo tempo são também os números divisíveis por 6.

mas eu queria que o primeiro teste verificasse se a divisão retornaria resto 0 pq ai sim seria divisivel por 2 e por 3, mas olhando o erro esta exatamente (eu creio no ==0 mesmo, pq… estou ali dizendo que quero o resultado da divisão igual a zero e não o resto… ) preciso saber como jogar o resto… (é mod ?)
olha o código… que montei

public static void main(String[] args) {
for (int i = 100; i <= 200; i++) {
if (((i / 2) == 0) && ((i / 3) == 0)) {
System.out.println(“O número " + i + " é Divisivel por 2 e 3”);
} else {
if ((i / 2) == 0) {
System.out.println(“O número " + i + " é Divisivel por 2”);
} else {
if ((i / 3) == 0) {
System.out.println(“O número " + i + " é Divisivel por 3”);
}
}
}
}
}
}[quote]

Quando for postar código, use a tag code:

seu código aqui

Tem um botãozinho para isso na barra de ferramentas, na hora que você posta aqui no GUJ.

Cuidado, a tag chama-se code e não quote. Quote é para citar alguém.

Olá, gostaria de agradecer a todos … pelas dicas… mas acabei descobrindo aqui de tanto bater cabeça… desculpem… estou iniciando em java. (segue o código)

Grato.

class ControleFluxoFor07 {

    public static void main(String[] args) {
        for (int i = 100; i <= 200; i++) {
            if (((i % 2) ==0) && ((i % 3)  ==0)) {
                System.out.println("O número " + i + " é Divisivel por 2 e 3");
            } else {
                if ((i % 2) == 0) {
                    System.out.println("O número " + i + " é Divisivel por 2");
                } else {
                    if ((i % 3) == 0) {
                        System.out.println("O número " + i + " é Divisivel por 3");
                    }
                }
            }
        }
    }
}

[quote=ViniGodoy]Uma dica… os números divisíveis por 2 e 3 ao mesmo tempo são também os números divisíveis por 6.
[/quote]

boa a dica!

1 curtida

ainda acho que devia seguir a dica

if (((i % 6)==0))

nao tenho certeza osbre isso mas se ficar assim

if (((i % 2) ==0) && ((i % 3) ==0)) {

o codigo fica mais lento pq tem q validar 2 condições

	public static void main(String[] args) {
		for (int i = 100; i <= 200; i++) {
			if (i % 6 == 0)
				System.out.println("O número " + i + " é Divisivel por 2 e 3");
			else {
				if (i % 2 == 0)
					System.out.println("O número " + i + " é Divisivel por 2");
				if (i % 3 == 0)
					System.out.println("O número " + i + " é Divisivel por 3");
			}
		}
	}
}

mais simples^^

Tb… pode ser…
Obrigado… pea dica.

[quote=Mart]ainda acho que devia seguir a dica

if (((i % 6)==0))

nao tenho certeza osbre isso mas se ficar assim

if (((i % 2) ==0) && ((i % 3) ==0)) {

o codigo fica mais lento pq tem q validar 2 condições

mais simples^^ [/quote]

Com certeza fica mais lento.
Pelo divisor por 6 o código fica mais limpo e agil, para qq explicação didática, é só por um comentário ao lado q fica legal!

[quote=Magno_LC]Com certeza fica mais lento.
Pelo divisor por 6 o código fica mais limpo e agil, para qq explicação didática, é só por um comentário ao lado q fica legal![/quote]

Acho que a diferença de performance vai ser muito pequena para ser percebida. Aliás, muito, muito, muito pequena mesmo. O que realmente aumenta a performance é fazer isso aqui:

class ControleFluxoFor07b { public static void main(String[] args) { //204 é o primeiro número divisível por 6 que é também maior que 200 //Pulamos de 6 em 6, para encontrar os próximos números for (int i = 204; i <= 300; i +=6 ) { System.out.println("O número " + i + " é Divisivel por 2 e 3"); } }

Agora sim, nenhuma comparação e o algoritmo ainda percorre 1/6 dos números da versão anterior. :slight_smile:

porém nao é isso que ele queria fazer, pelo que entendi ele qria listar todos os numeros
divisiveis por 2, por 3 e por 2 e 3, logo c o numero nao eh divisivel pelos 2 (so por 1 deles) ele qr q apareça a mensagem

a diferença pode ser pequena num programa assim, mas se for num sistema grande, cada"detalhe" faz um diferencial la na frente

PS: gostei da logica

for (int i = 204; i <= 300; i +=6 ) ^^, mas axo q mesmo assim nao cabe ao problema dele


public class ControleFluxoFor07 {

    public static void main(String[] args) {   
	for (int i = 200; i <= 300; i++) {   
	    boolean divisivelPorDois = false;
	    boolean divisivelPorTres = false;
	    divisivelPorDois = (i%2 == 0);
	    divisivelPorTres = (i%3 == 0);
	    if(divisivelPorDois && divisivelPorTres){
		System.out.println("O número " + i + " é Divisivel por 2 e 3");   
	    }else if(divisivelPorDois){
		System.out.println("O número " + i + " é Divisivel por 2");   
	    }else if(divisivelPorTres){
		System.out.println("O número " + i + " é Divisivel por 3");   
	    }else{
		System.out.println("O número " + i + " não é divisivel por 2 e/ou por 3");
	    }
	}   
    }   

}

[quote=ViniGodoy]Uma dica… os números divisíveis por 2 e 3 ao mesmo tempo são também os números divisíveis por 6.
[/quote]

:!:

[quote=Giulliano][code]

public class ControleFluxoFor07 {

public static void main(String[] args) {   
for (int i = 200; i <= 300; i++) {   
    boolean divisivelPorDois = false;
    boolean divisivelPorTres = false;
    divisivelPorDois = (i%2 == 0);
    divisivelPorTres = (i%3 == 0);
    if(divisivelPorDois && divisivelPorTres){
	System.out.println("O número " + i + " é Divisivel por 2 e 3");   
    }else if(divisivelPorDois){
	System.out.println("O número " + i + " é Divisivel por 2");   
    }else if(divisivelPorTres){
	System.out.println("O número " + i + " é Divisivel por 3");   
    }else{
	System.out.println("O número " + i + " não é divisivel por 2 e/ou por 3");
    }
}   
}   

}
[/code][/quote]

Eu costumava colocar esta pergunta em testes de avaliação java para saber se a pessoa programa limpo. A resposta que se eu procurava era esta.
Dividir por 6 tem um problema muito grave : magic number. Mesmo que faça algo do tipo %(2*3) continua escondido o porquê dividir por este valor
equivale a saber que o numero é divisivel por ambos os valores. Isto significa que este código não é limpo. E código limpo é mais importante que o código “rápido”. Além disso, dividir por 6 nem sequer é mais rápido porque exige 3 divisões. Divisões são operações mais lentas que operações lógicas como &&. Seria uma opção se o objetivo fosse apenas detectar os numeros divisiveis por ambos, mas mesmo assim exigira um comentário de implementação sobre essa propriedade matemática.

contudo, no seu caso, eu ainda teria cortado 1% porque causa da inicialização desnecessária :wink:


public class ControleFluxoFor07 {

    public static void main(String[] args) {   
	for (int i = 200; i <= 300; i++) {   

	    boolean divisivelPorDois = (i%2 == 0);
	    boolean divisivelPorTres =  (i%3 == 0);

	    if(divisivelPorDois && divisivelPorTres){
		System.out.println("O número " + i + " é Divisivel por 2 e 3");   
	    }else if(divisivelPorDois){
		System.out.println("O número " + i + " é Divisivel por 2");   
	    }else if(divisivelPorTres){
		System.out.println("O número " + i + " é Divisivel por 3");   
	    }else{
		System.out.println("O número " + i + " não é divisivel por 2 e/ou por 3");
	    }
	}   
    }   

}

Realmente, se precisa listar todos a lógica que postei não serve.

Se o mais rápido é adequado ou não, só a aplicação irá dizer. Nesse caso, obviamente, você pode escrever do jeito que quiser, que a diferença de performance não será perceptível.

E o ideal é sempre priorizar o código mais legível e não o mais rápido.

Essa inicialização desnecessária foi proposital, para que o dono da thread pudesse achar uma melhoria, mas agora vc estragou tudo …rs

Concordo com o que foi dito, código limpo é muito melhor que código “perfomático”, mesmo por que o tempo de resposta de um processamento normalmente fica abaixo de 0,5 segundos. Performance é preocupação quando precisarmos usar EJB, Servlets, JPA…mas aí são outros quinhentos.

[]'s