¿Java no calcula correctamente o qué estoy haciendo mal?
Quiero escribir un programa que tenga algo que ver con 3x+1, pero eso no es importante.
Primero tiene que determinar si el número dado es par o impar. Esto se hace mediante una declaración de switch:
switch(input % 2)
{
case 0: //par
input = input / 2;
count++;
break;
case 1: //impar
input = 3 * input + 1;
count++;
break;
}
Los números pares se dividen por 2, los impares se multiplican por 3 y se incrementan en 1.
El problema es que imprime números que están completamente equivocados. Por ejemplo, usando 2:
Por favor ingrese un número:
2
50
25
76
38
19
58
29
88
44
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
Loop llegado a 4, 2, 1.
Tomó 24 pasos.
¿Dónde está el error?
Gracias por cualquier respuesta.
Codigo completo:
package de.craftingdani.math.main;
import java.io.IOException;
public class Main
{
static long count = 0;
public static void main(String[] args)
{
try
{
System.out.println("Por favor ingrese un número:");
tryNumber(System.in.read());
}
catch(Exception e)
{
System.err.println("Error, por favor ingrese un número válido");
e.printStackTrace();
}
}
public static void tryNumber(int input) throws InterruptedException, IOException
{
Thread.sleep(100);
System.out.println(input);
switch(input % 2)
{
case 0: //par
input = input / 2;
count++;
break;
case 1: //impar
input = 3 * input + 1;
count++;
break;
}
if(input == 1)
{
System.out.println("Loop llegado a 4, 2, 1.");
System.out.println("Tomó " + count + " pasos.");
return;
}
tryNumber(input);
}
}
davy.ai
El error está en el método
tryNumber
donde la entrada se lee como un solo byte utilizandoSystem.in.read()
, lo cual no es suficiente para leer números más grandes. Esto resulta en cálculos incorrectos y una salida incorrecta. Para solucionar el problema, puedes usarScanner
para leer la entrada como un entero. Modifica el métodomain
de la siguiente manera:Esto leerá la entrada como un entero y lo pasará al método
tryNumber
para realizar cálculos y una salida correcta.