Soma de ímpares e multiplicação de pares [RESOLVIDO]

8 respostas
G

Este é basico, mas devo estar errando alguma coisa e não percebendo alguma falha na lógica.

O exercício que me foi proposto foi o seguinte:
"Escreva um programa que imprima na tela
a soma dos números ímpares entre 1 e 30 e a
multiplicação dos números pares entre 1 e 30."

Fiz o código assim:

import javax.swing.JOptionPane;
class Numeros{

public static void main (String []args){

int x = 0, par=0, impar=0;
int i, mp, si, totalPar;

for(i=0; i<30; i++){

if(i%2==0){

	if(i>2){

	par = par*i;

	}
	
	else{
	par = i;
	}

}

else{

impar = impar+i; //este deu certo: 225
}


}

JOptionPane.showMessageDialog(null, "Soma dos ímpares é: "+impar);
JOptionPane.showMessageDialog(null, "Multiplicação dos pares é: "+par);
}

}

Pois é.
A soma dos ímpares, tranquilo.
O problema (se é que há um) está na multiplicação dos pares. O resultado obtido com o código é "-905969664".
Mas quando faço na calculadora, o resultado obtido é: "1428329123020800".

Pois é.
Alguém sabe me dizer onde estou errando?

Valeu pessoal!
Té.

8 Respostas

M

D

O tipo primitivo int tem uma limitação, ele vai até 62 mil e algumas coisas.
Altere para long e então terá o resultado esperado.

D

MichelSante:
Leia sobre pre incremento e pos incremento.

E mude a forma de somar e de multiplicar que vc vai perceber o problema…

Bem, não vi nada relacionado a pré ou pós incremento.
Tampouco a forma de multiplicar está errada…
A questão é o tamanho do valor gerado, nada mais.

R

Troque

for(i=0; i<30; i++){

por

for( i=1 ; i <= 30; i++){

e utilize variáveis do tipo long ao invés de int.

J

O problema é que um int não vai suportar o valor que vai ser multiplicado…

import javax.swing.JOptionPane;  
class Numeros{  

	public static void main (String []args){  
		  
		int x = 0, impar=0;
		int i, mp, si, totalPar;
		Long par = new Long(0);
		  
		for(i=0; i<30; i++){  
		  
		if(i%2==0){  
		  
		    if(i>2){  
		  
		    par = par*i;  
		  
		    }  
		      
		    else{  
		    par = new Long(i);  
		    }  
		  
		}  
		  
		else{  
		  
		impar = impar+i; //este deu certo: 225  
		}  
		  
		  
		}  
		  
		JOptionPane.showMessageDialog(null, "Soma dos ímpares é: "+impar);  
		JOptionPane.showMessageDialog(null, "Multiplicação dos pares é: "+par);  
	}
}
G

Aee!

É isso mesmo drsmachado, era o int que não suportava o valor.

Isso que no começo desta semana eu fiz uma tabela com os valores máximos de cada variável (li no Use a Cabeça e tomei nota, hehehe).

Valeu a todos pela ajuda.

Té.

D

Tranquilo. Apenas edite o tópico original, colocando [resolvido] no título.
Outra coisa, esse tipo de situação é bastante comum. Embora no cotidiano não tenhamos situações em que isto seja cobrado, é bem fácil se perder.

V

Para um enunciado assim, temos algumas alternativas.

"Escreva um programa que imprima na tela a soma dos números ímpares entre 1 e 30 e a multiplicação dos números pares entre 1 e 30."

Alternativa 1 (menos flexível, mas a mais fácil de implementar e rápida em tempo de execução):
public class Facil {
   public static void main(String[] args) {
      System.out.println("Soma dos ímpares entre 1 e 30: 225");
      System.out.println("Multiplicação dos pares entre 1 e 30: 42849873690624000");
   }
}

Alternativa 2 (provavelmente a que seu professor espera):

public class Simples {
   public static void main(String[] args) {
		int soma = 0;
		long produto = 1;
		for (int i = 1; i < 30; i+= 2) {
			soma += i;
			produto *= (i+1);
			System.out.println(i);
		}
		
		System.out.println(soma);
		System.out.println(produto);
   }
}

Detalhe que, se não fosse pela soma dos produtos, você também poderia resolver a soma dos termos usando a fórmula da progressão aritmética.

Criado 26 de maio de 2011
Ultima resposta 26 de mai. de 2011
Respostas 8
Participantes 6