Java - conversión de números

 
Vista:

conversión de números

Publicado por juan (1 intervención) el 05/12/2018 01:38:00
Mathew, un estudiante de primer año de ingeniería, está desarrollando una notación posicional original para representar números enteros. Lo llamó "A Curious Method" (ACM para abreviar). La notación ACM utiliza los mismos dígitos que la notación decimal, es decir, de 0 a 9. Para convertir un número A de ACM a notación decimal debe agregar k términos, donde k es el número de dígitos de A (en la notación ACM). El valor del i-ésimo término, correspondiente al i-ésimo dígito ai, que va de derecha a izquierda, es ai * i !. Por ejemplo, 719ACM es equivalente a 53 en notación decimal, ya que 7 * 3! + 1 * 2! + 9 * 1! = 53. Mateo acaba de comenzar a estudiar la teoría numérica, y probablemente no sabe qué propiedades debe tener un sistema de numeración, pero en este momento sólo está interesado en convertir un número de ACM a decimal. ¿Podrías ayudarlo?

Quien realizará la conversión del número será la una función que reciba la cadena del número ACM y regrese el número en decimal.

Especificación de entrada



Cada caso de prueba se da en una sola línea que contiene una cadena no vacía de un máximo de 5 dígitos, que representa un número en la notación ACM. La cadena no tiene ceros a la izquierda. El último caso de prueba es seguido por una línea que contiene un cero.



Especificación de salida



Para cada caso de prueba, genere una sola línea que contenga la representación decimal del número ACM correspondiente.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

nesecito ayuda urgente!

Publicado por Billy Joel (878 intervenciones) el 05/12/2018 06:06:46
Podrías explicarme como es que 719ACM = 53?
(7 x 3) + (1 x 2) + (9 x 1)
21 + 2 + 9 = 32
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

nesecito ayuda urgente!

Publicado por Kabuto (1385 intervenciones) el 05/12/2018 23:41:21
Ojo, que algunos números son factoriales

7 * 3! + 1 * 2! + 9 * 1!

Esto sería:

7 * (3*2*1) + 1 * (2*1) + 9 * (1)

Equivale a:

7 * 6 + 1 * 2 + 9 *1 --> 42 + 2 + 9 = 53
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

nesecito ayuda urgente!

Publicado por Billy Joel (878 intervenciones) el 06/12/2018 16:06:33
Antes de empezar agradezco a Kabuto por esclarecerme lo del ! y los factoriales.

El programa se trata de manejo de la clase String para iterar a través de cada uno de los caracteres que tiene.
Entonces es leer caracter por caracter de izquierda a derecha; Transformarlo a número y multiplicarlo por el factorial de [digitos - indice de iteración]. Acumular todo y devolverlo.

Así lo resulvo yo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class ACM {
 
    /**
     * Maximo de digitos permitidos
     */
    public static final int MAX_DIGITOS = 5;
 
    /**
     * Devuelve el factorial de un número
     * @param n número del que se quiere obtener el factorial
     * @return 
     */
    private static int getFactorial(int n) {
        int f = 1;
        for (int i = n; i >= 1; i--) {
            f *= i;
        }
        return f;
    }
 
    /**
     * Transforma un número en notación ACM a Decimal
     * @param acm
     * @return 
     */
    public static int getDecimalFromACM(Integer acm) {
        int d = 0; //Declaramos la variable que contendrá la sumatoria final
        int j = acm.toString().length(); //Esta variable nos servirá como index de cada factorial que se va a sacar
        //Recorremos el número digito a digito, de izquierda a derecha
        for (int i = 0; i < acm.toString().length(); i++) {
            d += Integer.parseInt(String.valueOf(acm.toString().charAt(i))) * getFactorial(j);
            j--;
        }
        return d;
    }
 
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Integer numero;
        do {
            try {
                System.out.println("Introduzca el número ACM que quiere convertir a decimal: ");
                System.out.println("o introduzca un cero (0) para terminar el programa ");
                String s = br.readLine();
                if (s.equals("0")) {
                    System.out.println("fin del programa...");
                    numero = 0;
                } else if (s.length() < MAX_DIGITOS) {
                    numero = Integer.parseInt(s);
                    System.out.println("El número " + numero + "ACM en notación decimal es: " + getDecimalFromACM(numero));
                } else {
                    System.out.println("El numero ingresado exede el maximo de digitos que es " + MAX_DIGITOS + " digitos. El número ingresado posee " + s.length() + " digitos.");
                    numero = -1;
                }
 
            } catch (IOException | NumberFormatException ex) {
                System.out.println("Hubo un error de lectura, vuelva a intentar");
                numero = -1;
            }
        } while (numero != 0);
    }
}

El método main lo ajusté a los requisitos del enunciado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar