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
factorial
rutina y dividiremos internamente la cadena en sus dígitos para poder realizar la multiplicación.
Así que aquí está el código: la getDigits
funció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 increase
y sean multiply
más simples). La increase
función toma dicha lista y la aumenta en uno. Como su nombre lo indica, la multiply
funció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 factorial
funció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.