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