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

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:

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

}[/code]

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é.

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.

[quote=MichelSante]Leia sobre pre incremento e pos incremento.

E mude a forma de somar e de multiplicar que vc vai perceber o problema…[/quote]

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.

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.

1 curtida

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);  
	}
}

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é.

1 curtida

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.

Para um enunciado assim, temos algumas alternativas.

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):

[code]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);

}
}[/code]

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.

1 curtida