Tema destacado: Recuperar cuenta de Google, GMail, Youtube
Autor
|
Tema: Para programadorez y matematicos (Leído 4,408 veces)
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.993
La felicidad no es una meta, es un camino.
|
ERROR... Lo he probado con un número al azar, 25 para ser exacto... y me da como resultado: Numero anterior a los ceros 5 Despues de este hay 5 cifras cero Lo cual es incorrecto... 25! termina en seis ceros y su última cifra significativa es 4. Saludos.
EDITADO Lo olvidaba 43051! termina en 10759 ceros. 43051 entre 5 = 8610 8610 entre 5 = 1722 1722 entre 5 = 344 344 entre 5 = 68 68 entre 5 = 13 13 entre 5 = 2 Que sumados nos da: 10759
|
|
|
|
« Última modificación: 26 Septiembre 2005, 08:53 por jvchino »
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
esta bien que no mandaran privado, me gusto observar como lo tratan de hacer, de hecho. no mas privado, este es un reto colectivo. buen trabajo los 2. lo de jvchino, lo explico: 12! 2*3*4*5*6*7*8*9*10*11*12 = 2^10*3^5*5^2*7*11 = 479001600 hay 2 numeros 5, hay 2 ceros.  lo de henry: tu programa no funciona desde el factorial de 15, pero muy buen trabajo. el motivo es este: 8717829120000000000000000000 = 14! el 2 por 15 30 tomas el 3 pero... 12*15=180, debes tomar el 8.
|
|
|
|
« Última modificación: 26 Septiembre 2005, 14:14 por Sirdarckcat »
|
En línea
|
|
|
|
- Henry -
Desconectado
Mensajes: 63
|
Tienen razón... creo que me falto hacer mas pruebas, en fin... el problema me sigue siendo interesante. ah, y no soy Mateatico solo fue una idea abstracta que tube, pero, le buscare por otro lado.
|
|
|
|
|
En línea
|
|
|
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.993
La felicidad no es una meta, es un camino.
|
Podría agregar que la última cifra significativa del factorial de cualquier número siempres será cifra par.
Sirdarckcat, si tienes la respuesta... compárala con la que te mando en privado para que siga siendo un reto para los demás. El programa está 100% probado.
Saludos.
|
|
|
|
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.993
La felicidad no es una meta, es un camino.
|
Estuve leyendo un libro super viejo, y por casualidad encontré la manera de determinar la última cifra significariva del factorial de un número.
Ya lo probé y funciona. Me da los mismos resultados que el programa que desarrollé y le envié a Sirdarckcat, pero mucho más rápido.
Si gustan decargarlos al final de mi mensaje. (archivo: factorial.zip)
No publico el código fuente o algoritmo por si alguien quiere seguir intentándolo. Pero con gusto lo publicaré si me lo piden.
P.D. El archivo contiene dos ejecutables: el primero es cien por ciento mío y el otro con lo que encontré en el libro.
EDITED Programa corregido. Gracias Sirdarckcat
|
|
|
|
« Última modificación: 30 Septiembre 2005, 07:28 por jvchino »
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
jeje, interesante.. ¿que libro es? que tengo a mi dispocision un gran gran biblioteca de programacion y estos topicos, y me gustaria ver como funciona, que el que yo use, era 2 cosas: lento y aburrido el de jvchino es: normal y ordenado esque en el mio usé java, y hubieran visto el problemota que tenia con los strings... mientras que jvchino.. pues sin comentarios.. lo unico malo que vi es que no saca factoriales mayores a 15 cifras.. correctos osea el factorial de un numero de 15 cifras, que bueno.. estaria loco si se los pidiera verdad? debe ser por la longitud de variables que puede acomodar.. en mi codigo para sacar un numero de 15 cifras, el programa multiplicaria un numero 15 cifras por otro, el de jvchino, multiplica todos los numeros antes del significativo por el numero siguiente. esto considerenlo una super pista. pero si hay algun matematico por ahi, enseñeme una manera de sacar el resutado sin necesitar siquiera conocer que es programacion. se que se puede, de hecho en eforos.net estuvieron cerca, pero se murio el foro, que lastima, yo llegue y coloque mi resultado, pero solo pedian el factorial de 1000, aunque bueno.. Intentenlo, piensen  Saludos. (postdata, greios, yusent, 0_Kool, ILTrovatore si leen esto avisenme si revive no porfa? mi mail es sirdarckcat en gmail punt0 com)
|
|
|
|
|
En línea
|
|
|
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.993
La felicidad no es una meta, es un camino.
|
lo unico malo que vi es que no saca factoriales mayores a 15 cifras Eso es limitación de software... el máximo número entero que soporta el pascal es "2147483647", ni siquiera llega a 11 cifras 
|
|
|
|
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.993
La felicidad no es una meta, es un camino.
|
Si quieres hacerlo manualmente, te explico lo que entendí (digo lo que entendí porque el libro estaba en Inglés). La explicación matemática es un poco confusa (se basa en residuos de 20)... pero el procedimiento para programarlo o hacerlo a mano es sencillo.
Es un bucle, por cada iteración se calculan dos factores secundarios (FS1 y FS2), estos se multiplican y obtienes otro factor (F1, F2, F3,...). Luego multiplicas F1 x F2 x F3 x F4 ... La última cifra de ese producto es la última cifra del factorial.
FS1, solo puede tener dos valores. - Si la división N entre 20 es exacta entonces FS1 = 6 - Caso contrario FS1 = 1
Para FS2, creas un vector de restos y factores, si el resto (residuo) es 0 el FS2 es 1; si el resto es 1 el FS2 es 1, si el resto es 2 el FS2 es 2, si el resto es 3 el FS2 es 6... (mejor miren la tabla)
Resto FS2 0 1 1 1 2 2 3 6 4 4 5 2 6 2 7 4 8 2 9 8 10 4 11 4 12 8 13 4 14 6 15 8 16 8 17 6 18 8 19 2
Tomemos como ejemplo el número 43051.
Primera iteración 43051 entre 20 La división no es exacta => FS1 = 1 El residuo es 11 => FS2 = 4 Calculamos F1 = 1 x 4 = 4
Dividimos 43051 entre 5 y tomamos la parte entera = 8610
Segunda iteración 8610 entre 20 La división no es exacta => FS1 = 1 El residuo es 10 => FS2 = 4 Calculamos F2 = 1 x 4 = 4
Dividimos 8610 entre 5 y tomamos la parte entera = 1722
Tercera iteración 1722 entre 20 La división no es exacta => FS1 = 1 El residuo es 2 => FS2 = 2 Calculamos F3 = 1 x 2 = 2
Dividimos 1722 entre 5 y tomamos la parte entera = 344
Cuarta iteración 344 entre 20 La división no es exacta => FS1 = 1 El residuo es 4 => FS2 = 4 Calculamos F4 = 1 x 4 = 4
Dividimos 344 entre 5 y tomamos la parte entera = 68
Quinta iteración 68 entre 20 La división no es exacta => FS1 = 1 El residuo es 8 => FS2 = 2 Calculamos F5 = 1 x 2 = 2
Dividimos 68 entre 5 y tomamos la parte entera = 13
Sexta iteración 13 entre 20 La división no es exacta => FS1 = 1 El residuo es 13 => FS2 = 4 Calculamos F6 = 1 x 4 = 4
Dividimos 13 entre 5 y tomamos la parte entera = 2
Séptima iteración 2 entre 20 La división no es exacta => FS1 = 1 El residuo es 2 => FS2 = 2 Calculamos F7 = 1 x 2 = 2
Dividimos 2 entre 5 y tomamos la parte entera = 0
Aquí termina el proceso, cuando el cociente es CERO.
Ahora se multiplican todos los EFES F1 x F2 x F3 x F4 x F5 x F6 x F7 = 2048
Por lo tanto el factorial de 43051 termina en 8
Obviamente es mucho más rápido que el primero que hice. En el anterior necesitaba hacer 43051 iteraciones, en este solamente 7.
Saludos.
P.D. Queda en ustedes programarlo.
|
|
|
|
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
|
|