[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 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]
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");
}
}
}
}
}
}
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");
}
}
}
}
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.
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");
}
}
}
}
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
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.