Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] [Ayuda]Factorial suma dígitos

Estas en el tema de [Ayuda]Factorial suma dígitos en el foro de Java en Foros del Web. n ! significa n × ( n - 1) × ... × 3 × 2 × 1 Por ejemplo, 10! = 10 × 9 × ...
  #1 (permalink)  
Antiguo 27/02/2015, 10:31
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
[Ayuda]Factorial suma dígitos

n ! significa n × ( n - 1) × ... × 3 × 2 × 1

Por ejemplo, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3.628.800,
y la suma de los dígitos en el número 10! es 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Encuentra la suma de los dígitos en el número 100!
-----------------------------------------------------------------------------------------

El programa hace las multiplicaciones correctamente, de cualquier numero, el problema es en el divisor, me explico, antes pongo el código:

Código Java:
Ver original
  1. public class FactorialDigito {
  2.  
  3.     public static void main(String[] args) {
  4.        
  5.         double Resultado = 1;
  6.         double divisor = 1;
  7.         long Sumatorio = 0;
  8.        
  9.        
  10.         for(int i =100 ; i >= 1;i--){
  11.        
  12.         if(divisor < Resultado){
  13.             divisor = divisor * 10;
  14.         }
  15.         Resultado = i * Resultado; 
  16.        
  17.         if(divisor > Resultado && i == 1){
  18.             divisor = divisor / 10;
  19.         }
  20.        
  21.         if(i == 1){
  22.         for(int x = 0; x == 0;){
  23.         Sumatorio = (long)(Resultado / divisor)%10+(Sumatorio);
  24.         divisor = divisor / 10;
  25.        
  26.         if(divisor == 1){
  27.             x = 1;
  28.         }
  29.         }
  30.        
  31.         }
  32.      
  33.         }
  34.            
  35. System.out.println(Sumatorio);
  36.     }
  37.  
  38. }

A ver el problema esta en la variable DIVISOR, cuando pongo un numero chiquitito(como 20)hace bien los (*10) pero cuando es un numero muy grande como por ejemplo 100, entonces el Divisor cuando llega a una cantidad muuuuuy grande, "se vuelve loco" y lo que hace es que se vuelve negativo.

10 = me da 27, que esta bien
20 = me da 54, tambien bien
30 = me da 157,¿Aquí ya no se si esta bien? (Aqui tambien hace cosas raras y se convierte en 9999999999999999 y luego se pone de nuevo a 1.0000000000000007E39 o lo que sea...)

Nota: No me hagan el código porfavor, prefiero que me ayudes antes que me hagas el código, para mejorar, gracias.

Que rabia me da

Saludos y muchisimas gracias a los que pierda tiempo en mi
  #2 (permalink)  
Antiguo 27/02/2015, 10:45
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: [Ayuda]Factorial suma dígitos

Tambien quiero aclarar una cosita:

Modifique esta línea:

Código Java:
Ver original
  1. for(int e = 0; e < 99;e++){
  2.             if(divisor < Resultado){
  3.                 divisor = divisor * 10;
  4.             }
  5.            
  6.            
  7.         }

Creo que asi ahora esta mejor, por que muchas veces la diferencia era de 2-3 ceros
Aunque sigue fallando en numeros altos como el 100
  #3 (permalink)  
Antiguo 27/02/2015, 11:17
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: [Ayuda]Factorial suma dígitos

1.0000000000000007E39 es 1.0000000000000007*10^39

Cuando los números son muy grandes (o muy pequeños) se representan con notación científica.

Por otro lado, double tiene una precisión determinada, no puedes representar cualquier número con un double (ni decimal ni entero), cuando eso ocurre lo sustituye un valor cercano.

Cuando se quiere trabajar con números muy grandes o con gran precisión, como dinero o cálculos científicos, se usa BigDecimal y BigInteger, auqnue estos tampoco son perfectos.

http://www.javamex.com/tutorials/mat...gInteger.shtml

No he leído tu código, así que quizás tengas también errores en tu algoritmo.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #4 (permalink)  
Antiguo 27/02/2015, 12:42
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: [Ayuda]Factorial suma dígitos

Xerelo amigo

Cuando creo:

Código Java:
Ver original
  1. BigDecimal Resultado = new BigDecimal(1);
  2.         BigDecimal divisor = new BigDecimal(1);
  3.         BigDecimal sumatorio = new BigDecimal(0);
Me da error en las sentencias...
divisor > Resultado

yo se que para multiplicar,dividir,sumar,restar hay que utilizar:
Código Java:
Ver original
  1. BigDecimal prueba = Resultado.add(otraVariable);

Pero el tema es que no se puede comparar... ejemplo, esto daría error:

Código Java:
Ver original
  1. if(divisor > Resultado){
  2.             divisor = divisor / 10;
  3.         }

Por lo menos se que lo hice bien por que hasta el 21, es capaz de hacerlo perfectamente, a partir del 22 es cuando da error...

Creo que este ejercicio la unica forma era haciendolo con métodos no?

Última edición por sixtoex; 27/02/2015 a las 12:56
  #5 (permalink)  
Antiguo 27/02/2015, 13:38
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: [Ayuda]Factorial suma dígitos

Buenas,

Para eso BigInteger tiene el método compareTo: http://www.tutorialspoint.com/java/m..._compareto.htm

Yo te recomendaria revisar y simplificar el algorimo. Resulta mas claro si haces dos bucles, uno para calcular el factorial (un for con 2 lineas de código) y luego otro para sumar las cifras del resultado (otro for con 3 lineas de código).

Yo lo he hecho así y usando BigInteger y el código es mucho más compacto y comprensible. Mi resultado para 100 es:
Código Salida Programa:
Ver original
  1. Factorial:93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
  2. Suma: 648

No te voy a poner mi código ya que por lo que has dicho quieres intentarlo tu mismo, pero si no te sale a lo mejor te puede servir para que puedas refactorizar el tuyo.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #6 (permalink)  
Antiguo 28/02/2015, 10:23
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: [Ayuda]Factorial suma dígitos




Amigos, ya lo tengo solucionado jejejejeje!!

Por fín, dejo el código:

Código Java:
Ver original
  1. import java.math.BigInteger;
  2. public class prueba
  3. {
  4.     public static void main(String[] args) {
  5.         int valor = 1;
  6.         BigInteger b1 = new BigInteger("1");
  7.     int NumeroFin = 0;
  8.     int PruebaTotal = 0;
  9.     String NumeroFinCadena = "";
  10.      //15511210043330985984000000                              // 2432902008176640000
  11.         long fin = 100;
  12.     BigInteger Sumatorio = new BigInteger("1");
  13.     BigInteger Contador = new BigInteger("1");
  14.     for(int i = 1; i <= fin;i++){
  15.     b1 = b1.multiply(Sumatorio);
  16.     Sumatorio = Sumatorio.add(Contador);
  17.     if(i == fin){
  18.     System.out.println(b1);
  19.     NumeroFinCadena = String.valueOf(b1);
  20.     PruebaTotal =NumeroFinCadena.length();
  21.    
  22.     }
  23.    
  24.     }
  25.     BigInteger b2 = new BigInteger("1");  //10000000000000000000000000
  26.     BigInteger Multiplicador = new BigInteger("10");
  27.     int Compara = 0;
  28.     Compara = b1.compareTo(b2);
  29.     for(int i = 0 ; i <= fin;i++){
  30.         for(int x = 0; x <= fin*500;x++){
  31.             Compara = b1.compareTo(b2);
  32.             if(Compara == 1){
  33.                
  34.                 b2 = b2.multiply(Multiplicador);   
  35.             }
  36.             Compara = b1.compareTo(b2);
  37.             if(Compara == -1){
  38.                 b2 = b2.divide(Multiplicador);
  39.             }
  40.         }
  41.         System.out.println(b2);
  42.         i = (int)fin +1;
  43.     }
  44.      
  45.     BigInteger bDivide = new BigInteger("10"); 
  46.     long GuardarAnterior = 0;
  47.     long ResultadoEntero = 0;
  48.     for(int i = 0; i < PruebaTotal;i++){
  49.     BigInteger Resul = b1.divide(b2);
  50.     Resul = Resul.mod(bDivide);
  51.     b2 = b2.divide(bDivide);
  52.     ResultadoEntero = Resul.longValue();
  53.     GuardarAnterior = ResultadoEntero + GuardarAnterior;
  54.     }
  55.    
  56.     System.out.println(GuardarAnterior);
  57.         }
  58.  
  59.     }

y por mi mismo, eso es lo que me da mas satisfacción, casi te pido el codigo jajajaja

Última edición por sixtoex; 28/02/2015 a las 11:30 Razón: Ya lo solucione
  #7 (permalink)  
Antiguo 28/02/2015, 11:33
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: [Ayuda]Factorial suma dígitos

Ya lo solucione amigos, casi te pido el código pero me puse y mira, al final lo conseguí:

i
Código Java:
Ver original
  1. import java.math.BigInteger;
  2. public class prueba
  3. {
  4.     public static void main(String[] args) {
  5.         int valor = 1;
  6.         BigInteger b1 = new BigInteger("1");
  7.     int NumeroFin = 0;
  8.     int FinalNumero = 0;
  9.     String NumeroFinCadena = "";
  10.      //15511210043330985984000000                              // 2432902008176640000
  11.         long fin = 100;
  12.     BigInteger Sumatorio = new BigInteger("1");
  13.     BigInteger Contador = new BigInteger("1");
  14.     for(int i = 1; i <= fin;i++){
  15.     b1 = b1.multiply(Sumatorio);
  16.     Sumatorio = Sumatorio.add(Contador);
  17.     if(i == fin){
  18.     System.out.println(b1);
  19.     NumeroFinCadena = String.valueOf(b1);
  20.     FinalNumero =NumeroFinCadena.length();
  21.    
  22.     }
  23.    
  24.     }
  25.     BigInteger b2 = new BigInteger("1");  //10000000000000000000000000
  26.     BigInteger Multiplicador = new BigInteger("10");
  27.     int Compara = 0;
  28.     Compara = b1.compareTo(b2);
  29.     for(int i = 0 ; i <= fin;i++){
  30.         for(int x = 0; x <= fin*500;x++){
  31.             Compara = b1.compareTo(b2);
  32.             if(Compara == 1){
  33.                
  34.                 b2 = b2.multiply(Multiplicador);   
  35.             }
  36.             Compara = b1.compareTo(b2);
  37.             if(Compara == -1){
  38.                 b2 = b2.divide(Multiplicador);
  39.             }
  40.         }
  41.         System.out.println(b2);
  42.         i = (int)fin +1;
  43.     }
  44.      
  45.     BigInteger bDivide = new BigInteger("10"); 
  46.     long GuardarAnterior = 0;
  47.     long ResultadoEntero = 0;
  48.     for(int i = 0; i < FinalNumero;i++){
  49.     BigInteger Resul = b1.divide(b2);
  50.     Resul = Resul.mod(bDivide);
  51.     b2 = b2.divide(bDivide);
  52.     ResultadoEntero = Resul.longValue();
  53.     GuardarAnterior = ResultadoEntero + GuardarAnterior;
  54.     }
  55.    
  56.     System.out.println(GuardarAnterior);
  57.         }
  58.  
  59.     }

Saludos y muchisimas gracias por perder tiempo en mi
  #8 (permalink)  
Antiguo 28/02/2015, 15:18
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: [Ayuda]Factorial suma dígitos

Buenas,

Genial, te felicito.

Pongo ya entonces mi solución, que es un poco más compacta.

Código Java:
Ver original
  1. import java.math.BigInteger;
  2.  
  3. public class Factorial {
  4.     private static final int NUMBER = 100;
  5.  
  6.     public static void main(String[] args) {
  7.         int total = 0;
  8.         BigInteger base = new BigInteger("10");
  9.  
  10.         BigInteger factorial = BigInteger.valueOf(1);
  11.         for (int i = 1; i <= NUMBER; i++)
  12.             factorial = factorial.multiply(BigInteger.valueOf(i));
  13.  
  14.         System.out.println("Factorial: " + factorial);
  15.  
  16.         int numDigits = factorial.toString().length();
  17.  
  18.         for(int i=0; i<numDigits; i++) {
  19.             total += factorial.mod(base).intValue();
  20.             factorial = factorial.divide(base);
  21.         }
  22.         System.out.println("Total: " + total);
  23.     }
  24. }


Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: programa, suma
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:14.