elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda con Código Sencillo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con Código Sencillo  (Leído 2,912 veces)
LaLakers94

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Ayuda con Código Sencillo
« en: 9 Noviembre 2013, 18:16 pm »

Hola, estoy empezando con Java y he empezado con actividades muy sencillitas, al menos me lo parecen hasta que me doy cuenta de que no sé hacerlas. Las intento probar mediante consola y no funcionan, no sé en que puedo fallar. Si me pudiesen echar una mano, lo agradecería de corazón.

Son 2 actividades:

1) Un método calcularNumeroArmonico tal que, dado un número entero n, devuelva el sumatorio 1 + 1/2 + 1/3 + … + 1/n. Este es mi código:
Código
  1. public static Double numeroArmonico (Integer n){
  2. Double numero = 0.0;
  3. for (int i = 1; i <= n; i++){
  4. numero += (1/i);
  5. }
  6. return numero; }

2)Un método que, dado un número entero n, devuelva la suma de todos sus dígitos. Por ejemplo, 12345 devolvería 15. Este es mi código:
Código
  1. public static Integer sumaDigitos (Integer n){
  2. Integer suma = 0;
  3. String numero = n.toString();
  4.  
  5. for (int i = 0; i < numero.length(); i++) {
  6. suma += Integer.valueOf(numero.charAt(i)); }
  7.  
  8. return suma; }

En el primero pruebo con n=3 y me devuelve 1.0
En el segundo, con 12345, me devuelve 255  :huh: :huh:

¿Qué error he cometido?


En línea

egyware


Desconectado Desconectado

Mensajes: 526



Ver Perfil WWW
Re: Ayuda con Código Sencillo
« Respuesta #1 en: 9 Noviembre 2013, 19:09 pm »

El primero es que haces esto

Código
  1. int divisor = 10;
  2. int numero = 5/divisor;
  3.  
Según nuestros conocimientos de matemática, el resultado debería ser 0.5. Sin embargo el resultado es 0. Pero dirán "es que estamos almacenando el numero en un entero" Y ES CIERTO entonces hacemos las modificaciones necesarias.

Código
  1. int divisor = 10;
  2. float numero = 5/divisor;

Sin embargo "numero" sigue siendo 0.
Lo que sucede realmente es que el compilador ASUME que estás haciendo una división entera debido que el divisor es entero. Para evitar que esto ocurra el divisor debe ser float o doble (puedes hacer un cast a float/double o declarar divisor como float/doble.)

Lo segundo NO TENGO IDEA PORQUE NO TE FUNCIONA, pero podrías intentar imprimir en pantalla que es lo que te devuelve "numero.charAt(i)" y luego  Integer.valueOf(numero.charAt(i)) para confirmar si está haciendo lo que debe.

Bueno Saludos! espero haberte ayudado.


En línea

LaLakers94

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Ayuda con Código Sencillo
« Respuesta #2 en: 9 Noviembre 2013, 19:57 pm »

Hola, muchas gracias por las respuestas.

He podido solucionar el primero y en el segundo he mostrado por pantalla lo que comentas.
Código
  1. Integer n1 = 12345;
  2. String numero = n1.toString();
  3.  
  4. System.out.println(numero.charAt(1));
  5. System.out.println(Integer.valueOf(numero.charAt(1))); //Devuelve 50 - Ni idea de por qué.

La línea 4 devuelve 2. (Parece que funciona).
La línea 5 devuelve 50 (Ni idea de por qué).
Como ''numero.charAt(i)'' devuelve el dígito correspondiente al índice i, he reorganizado el código eliminando el ''Integer.ValueOf()'' y me sigue dando mal, de hecho, es el mismo resultado erróneo (255).
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Ayuda con Código Sencillo
« Respuesta #3 en: 9 Noviembre 2013, 20:23 pm »

Hola. Al parecer, la conversión del char primitivo a int está devolviendo su valor ascii (creo).

Al parecer hay que utilizar el método de la clase Character getNumericValue, que devuelve el valor numérico (Integer) de ese número extraido en tipo char:

Código
  1. suma += Integer.valueOf(Character.getNumericValue(numero.charAt(i)));
  2.  

O puedes primero transformar ese char a String y luego convertirlo a Int:

Código
  1. suma += Integer.valueOf(String.valueOf(numero.charAt(i)));
  2.  

El código quedaría de éste método quedaría así:

Código
  1. public static Integer sumaDigitos (int n){
  2.    Integer suma = 0;
  3.    String numero = String.valueOf(n);
  4.  
  5.      for (int i = 0; i < numero.length(); i++) {
  6.        suma += Integer.valueOf(Character.getNumericValue(numero.charAt(i)));
  7.      }  
  8.  
  9.    return suma;
  10.  }
  11.  
En línea

LaLakers94

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Ayuda con Código Sencillo
« Respuesta #4 en: 9 Noviembre 2013, 20:37 pm »

Muchísimas gracias a ambos, ahora entiendo. Ya había optado por hacer otro método que se me había ocurrido (Ir dividiendo el entero entre 10 sucesivamente e ir sumando los restos) pero aplicaré este para no olvidarlo.

Gracias de nuevo.
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Ayuda con Código Sencillo
« Respuesta #5 en: 9 Noviembre 2013, 21:00 pm »

Igual te dejo el code por si te sirve:

Código
  1. import java.util.Scanner;
  2. import java.text.DecimalFormat;
  3.  
  4. public class OperacionesMatematicas {
  5.  
  6.  public static Double numeroArmonico (int n){
  7.    double numero = 1.0;
  8.    for (int i = 2; i <= n; i++){
  9.      numero += (double) (1.0/i);
  10.    }
  11.  
  12.    return numero;
  13.  }
  14.  
  15.  public static Integer sumaDigitos (int n){
  16.    int suma = 0;
  17.    String numero = String.valueOf(n);
  18.  
  19.      for (int i = 0; i < numero.length(); i++) {
  20.        suma += Integer.valueOf(Character.getNumericValue(numero.charAt(i)));
  21.      }  
  22.  
  23.    return suma;
  24.  }
  25.  
  26.  public static void main(String... args) {
  27.  
  28.    OperacionesMatematicas op1 = new OperacionesMatematicas();
  29.    Scanner into = new Scanner(System.in);
  30.    Object resultado = 0;
  31.    int numero = 0;
  32.    int choice;
  33.  
  34.    do {
  35.    System.out.println("&#191;Que operacion desea realizar?");
  36.    System.out.println("[+] 1 - Numero Armonico de un numero");
  37.    System.out.println("[+] 2 - Suma de Digitos de un numero");
  38.    choice = into.nextInt();
  39.    if(choice != 1 && choice != 2) {
  40.      System.out.println("Opcion no disponible. Intente nuevamente.");
  41.    }
  42.    } while (choice != 1 && choice != 2);
  43.  
  44.  
  45.    if (choice == 1) {
  46.      System.out.println("Ingrese el numero.");
  47.      numero = into.nextInt();
  48.      DecimalFormat df = new DecimalFormat("#,#,##0.00"); // para formatear un real (2 decimales)
  49.      System.out.println("Numero armonico de " + numero + ":\t" + df.format(op1.numeroArmonico(numero)));
  50.    }
  51.    else if (choice == 2) {
  52.      System.out.println("Ingrese el numero.");
  53.      numero = into.nextInt();
  54.      System.out.println("Suma de los digitos de " + numero + ":\t" + op1.sumaDigitos(numero));
  55.    }
  56.  
  57.    // System.out.print(Character.getNumericValue('%')); // devuelve -1 si le pasamos un char que no represente un numero
  58.  
  59.  }
  60.  
  61. }
  62.  



Un saludo.



PD: No uses los Wrapper de los primitivos si no es necesario. Puedes usarlos con Listas, o para utilizar metodos que estan en los Wrappers. Para lo sencillo, los primitivos van bien.
« Última modificación: 9 Noviembre 2013, 21:33 pm por M1t$u » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con Cola en C (sencillo) « 1 2 »
Programación C/C++
Adry89 10 19,641 Último mensaje 30 Mayo 2010, 23:40 pm
por Littlehorse
ayuda con ejercicio sencillo
Programación C/C++
Fer995 2 2,168 Último mensaje 30 Octubre 2010, 16:21 pm
por Fer995
ayuda con un programa sencillo
Programación C/C++
angelina_slayer 9 4,188 Último mensaje 10 Noviembre 2010, 15:01 pm
por flony
ayuda punteros sencillo
Programación C/C++
adexrn 2 2,297 Último mensaje 1 Marzo 2012, 21:53 pm
por adexrn
[Código-Python]Código Ofuscado nº2 JaAViEr|0x5d [Actualizado]
Scripting
0x5d 6 5,417 Último mensaje 7 Mayo 2013, 23:52 pm
por CodeSource
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines