Pitón
A continuación se muestra una versión de Python de la solución, que no se limita al límite de 32 bits (o 64 bits en un sistema muy reciente) para números enteros en Python. Para evitar esta limitación, usaremos una cadena como entrada y salida para la
factorialrutina y dividiremos internamente la cadena en sus dígitos para poder realizar la multiplicación.
Así que aquí está el código: la getDigitsfunción divide una cadena que representa un número en sus dígitos, por lo que "1234" se convierte [ 4, 3, 2, 1 ](el orden inverso simplemente hace que las funciones increasey sean multiplymás simples). La increasefunción toma dicha lista y la aumenta en uno. Como su nombre lo indica, la multiplyfunción se multiplica, por ejemplo, multiply([2, 1], [3])devuelve [ 6, 3 ]porque 12 por 3 es 36. Esto funciona de la misma manera que multiplicaría algo con lápiz y papel.
Finalmente, la factorialfunción usa estas funciones auxiliares para calcular el factorial real, por ejemplo, factorial("9")da "362880"como salida.
import copy
def getDigits(n):
digits = []
for c in n:
digits.append(ord(c) - ord('0'))
digits.reverse()
return digits
def increase(d):
d[0] += 1
i = 0
while d[i] >= 10:
if i == len(d)-1:
d.append(0)
d[i] -= 10
d[i+1] += 1
i += 1
def multiply(a, b):
subs = [ ]
s0 = [ ]
for bi in b:
s = copy.copy(s0)
carry = 0
for ai in a:
m = ai * bi + carry
s.append(m%10)
carry = m//10
if carry != 0:
s.append(carry)
subs.append(s)
s0.append(0)
done = False
res = [ ]
termsum = 0
pos = 0
while not done:
found = False
for s in subs:
if pos < len(s):
found = True
termsum += s[pos]
if not found:
if termsum != 0:
res.append(termsum%10)
termsum = termsum//10
done = True
else:
res.append(termsum%10)
termsum = termsum//10
pos += 1
while termsum != 0:
res.append(termsum%10)
termsum = termsum//10
return res
def factorial(x):
if x.strip() == "0" or x.strip() == "1":
return "1"
factorial = [ 1 ]
done = False
number = [ 1 ]
stopNumber = getDigits(x)
while not done:
if number == stopNumber:
done = True
factorial = multiply(factorial, number)
increase(number)
factorial.reverse()
result = ""
for c in factorial:
result += chr(c + ord('0'))
return result
print factorial("9")
Notas
En python, un número entero no tiene límite, por lo que si desea hacer esto manualmente, puede hacerlo
fac = 1
for i in range(2,n+1):
fac *= i
También existe la math.factorial(n)función muy conveniente .
Obviamente, esta solución es mucho más compleja de lo que debe ser, pero funciona y, de hecho, ilustra cómo puede calcular el factorial en caso de que esté limitado por 32 o 64 bits. Entonces, aunque nadie creerá que esta es la solución que se le ocurrió para este simple problema (al menos en Python), en realidad puede aprender algo.