es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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);
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    El error está en el método tryNumber donde la entrada se lee como un solo byte utilizando System.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 usar Scanner para leer la entrada como un entero. Modifica el método main de la siguiente manera:

    public static void main(String[] args)
    {
        try (Scanner scanner = new Scanner(System.in))
        {
            System.out.println("Por favor ingrese un número: ");
            int input = scanner.nextInt();
            tryNumber(input);
        }
        catch(Exception e)
        {
            System.err.println("Error, por favor ingrese un número válido");
            e.printStackTrace();
        }
    }
    

    Esto leerá la entrada como un entero y lo pasará al método tryNumber para realizar cálculos y una salida correcta.

Comments are closed.