Bueno, creo que tengo la solucion, el numero anterior a los ceros de el factorial de 43051 es 3, y despues de este, hay 10675 ceros a la derecha.
para obtener la solucion hice esto:
Ya que en una variable no se puede almacenar una cifra tan grande, lo que hice fue ingeniarmelas para no tener que usar toda la longitud de el factorial.
Si solo me interesa el anterior a los ceros, pues ese tomare.
parece facil hasta aqui, pero para programarlo es otro rollo, bueno, aqui va una explicacion.
Primero, para entender lo que hice, analicemos esto:
6! = 1x2x3x4x5x6=720, el numero anterior a los ceros es "2",
por lo tanto, hasta aqui, es el que me interesa,
si siguiera multiplicando...
7! = 1x2x3x4x5x6x7=5040, ahora, el numero q nos interesa es el "4"
...pero si siguiera asi, hasta el 43051 no puedo almacenarlo en una variable, a menos que lo hiciera en Disco, pero tardaria mucho tiempo y seria algo complicado hasta aqui creo que no hay nada nuevo, pero si somos observadores...
veremos que el con el 2 que obtuvimos de 5! es posible obtener lo que queremos,, ¿Porque?
6!=720
7!=5040
Tomando solo el 2 de el 6!, podemos obtener el 4 que tiene 7! sin tener que multiplicar 720 * 7, sino, solo seria 2*7
para esto, los digitos a la izquierda ya no nos interesaran.
2*7=14, nos interesa el 4, Magia!!! aqui les va un ejemplo a ver si queda mas claro.
Normalmente --------------------------Datos nuevos
6!= 720 >> nos interesa soloel 2
7!=5040 >>ahora sera 2*7= 14, tomamos el 4
8!=40320 >>ahora seria 4*8= 32, tomamos el 2
9!=362880 >>Ahora seria 2*9= 18, tomamos el 8
Y asi sucesivamente... Si se fijan en los datos nuevos, ya no nos interesan los datos que se van acumulando a la izquierda y con esto ya tenemos espacio suficiente para guardar los resultados en una variable.
El programa lo hice en Pascal, pero si alguien lo necesita en otro lenguaje, me lo puede pedir.
{Programa que calcula un numero anterior a los ultimos ceros de
el resultado de un factorial}
Program factorial;
uses crt;
VAR
long,n,m,cont,conta2:longint;
x:real;
Begin
clrscr;
write('Teclea el numero a analizar: '); {En este caso pondremos 43051}
readln(n);
{inicializo contadores}
m:=1;
cont:=1;
conta2:=0;
while cont<=n do
begin
m:=m*cont; {calculando factorial "supuestamente"}
cont:=cont+1;
{en las siguientes lineas eliminar‚ todos los ceros que haya a la derecha}
x:=m mod 10;
{Mientras el residuo siga siendo Cero, seguire aqui}
while x = 0 do
begin
x:=m mod 10;
while (m mod 10) = 0 do
begin
m:=m div 10; {Aqu¡ es donde quito todos los ceros de la derecha}
conta2:=conta2+1; {y los voy contando...}
end;
end;
{ya eliminados los ceros, tomo el ultimo digito, este sera el nuevo digito...
...que se utilizara para multiplicarlo, asi sera solo el ultimo digito ...
...el que se multiplicar n veces }
if m > 10 then
m:=m mod 10;
end;
{ termina el while, termina todo}
writeln('Numero anterior a los ceros ',m);
writeln('Despues de este hay ',conta2,' cifras cero');
write('Henry :)');
readln;
end.
P.D. Perdon, No me gusta mandar mensajes Privados