Tiene que haber una forma mejor.
$100!$ es el producto de sólo 100 números pequeños, cada uno de los cuales tiene una factorización prima fácil de encontrar. Por el Teorema Fundamental de la Aritmética (y la conmutatividad), la factorización prima de $100!$ se puede encontrar "agrupando" los primos similares de cada una de las factorizaciones primarias de sus factores. Por ejemplo, $8! = 2^3 \cdot 7 \cdot 2 \cdot 3 \cdot 5 \cdot 2^2 \cdot 3 \cdot 2 = 2^7 \cdot 3^2 \cdot 5 \cdot 7$ .
Cada uno de los factores primos puede expandirse como potencias de 10, por ejemplo $a\times 10^2 + b \times 10 + c$ .
A partir de ahí, debería ser más o menos sencillo distribuir sobre potencias de 10 para encontrar cada dígito individual. Suma, y listo.
Voy a ver si puedo MATLAB un ejemplo ... pero aquí es un ejemplo para $8!$ :
$$\begin{align*} 8! &= 2^7 \cdot 3^2 \cdot 5 \cdot 7\\ &= (1\times 10^2 + 2\times 10 + 8) \cdot 9 \cdot (3\times 10 + 5) \\ &= (9 \times 10^2 + 18 \times 10 + 72) \cdot (3\times 10 + 5) \\ &= ((9+1) \times 10^2 + (8+7)\times 10 + 2) \cdot (3\times 10 + 5) \\ &= (1 \times 10^3 + 1\times 10^2 + 5\times 10 + 2) \cdot (3 \times 10 + 5) \\ &= 3 \times 10^4 + 3\times 10^3 + 15 \times 10^2 + 6 \times 10 + \ldots \\ &\ldots 5\times 10^3 + 5\times 10^2 + 25\times 10 + 10). \end{align*}$$
El último paso fue la distribución de 35 sobre los términos anteriores. Ahora, agrupa las potencias iguales sumando. Cada vez que obtengas un múltiplo de 2 dígitos de una potencia de 10, desplazamos su dígito a la siguiente potencia mayor de 10.
$$\begin{align*} 8! &= 3\times 10^4 + 9 \times 10^3 + 12\times 10^2 + 12\times 10 \\ &= 3\times 10^4 + 9 \times 10^3 + 13\times 10^2 + 2\times 10 \\ &= 3\times 10^4 + 10 \times 10^3 + 3\times 10^2 + 2\times 10 \\ &= 4\times 10^4 + 3\times 10^2 + 2\times 10 \\ &= 40320. \end{align*} $$
Ahora, aquí es donde se pone realmente genial.
La multiplicación de polinomios puede considerarse como una convolución de vectores, que es lo mismo que la Producto Cauchy . El número 40320 es básicamente un polinomio en potencias de 10. Imagina momentáneamente que el 10 no es un número, sino un símbolo como $x$ . Entonces,
$$40320 = 4 (10)^4 + 0 (10)^3 + 3 (10)^2 + 2 (10)^1 + 0 (10)^0.$$
Podemos escribirlo en forma vectorial como $[ 4\ 0\ 3\ 2\ 0 ]$ .
Si queremos entonces multiplicarlo por algo más, digamos $10 \cdot 9 = 9 (10)^1$ para calcular $10!$ , entonces encontramos la convolución discreta/producto de Cauchy de los dos vectores. Lo dejaré a tu criterio, dado que se ha señalado que algunas personas no ven con buenos ojos las soluciones demasiado completas a los problemas de PE.
Los comentarios a este post son dignos de mención. Sí, esto es exactamente una implementación de una biblioteca BigInt. Sí, esto es exactamente el algoritmo de multiplicación.
En mi opinión, sin embargo, el propósito de PE no es entrenar a la gente a encontrar bibliotecas para hacer su trabajo; es descubrir la matemática subyacente. Con suerte, las relaciones que he mencionado entre los productos de Cauchy, las convoluciones discretas y el algoritmo de multiplicación son interesantes, más interesantes que encontrar un lenguaje con soporte para BigInt.
0 votos
Esto es sólo una idea (no tengo ni idea de si es plausible o no), pero ¿no se podría calcular el número dígito a dígito, de modo que sólo se puedan sumar estos valores?
0 votos
Si vas a utilizar wolfralpha, sólo tienes que copiar el resultado y añadir los dígitos. De hecho, intente este directamente.
0 votos
Es una buena pregunta. Cuando hice esa pregunta en PE, usé un objeto BigInt, y lo codifiqué en Java. Es una solución complicada, y estoy interesado en ver a dónde va este hilo y si hay una solución más elegante.
0 votos
Bueno, en Python probablemente puedas hacerlo como un one-liner, tiene soporte nativo para números grandes. :)
1 votos
Ver este hilo de Meta sobre los problemas del proyecto Euler meta.math.stackexchange.com/questions/1090/
0 votos
Jugador Grady: sería mucho mejor que publicaras tus preguntas sobre el Proyecto Euler en los foros del Proyecto Euler. No están nada mal.
0 votos
No tiene acceso al foro de este problema ya que aún no lo ha completado.. @Grady Player, ¿no se supone que debes resolver estos problemas por tu cuenta? Eso es el 99% de la diversión del Proyecto Euler...
0 votos
@jameselmore pues ya lo he resuelto de varias formas diferentes... pero ninguna de ellas es especialmente buena, simplemente están usando python o la libra de matemáticas de cadenas o lo que sea... Me parece que esas son una especie de trampa... Estaba buscando algo que no entendiera sobre los números que hiciera esta tarea más sencilla... parece que como todas las respuestas tratan de realizar esta acción en formatos decimales abstraídos, puede que no haya una forma mejor.
0 votos
@GradyPlayer La cuestión con problemas como este es que cuando necesitas calcular la suma de dígitos, casi siempre necesitas resolver cuáles son esos dígitos. Así que no hay manera de evitar tener que lidiar con los formatos decimales, pero hay formas inteligentes de evitar tener que usar bibliotecas de terceros, rutinas personalizadas, o cualquier otra extensión de la aritmética estándar de 32 bits.