Python
Vous trouverez ci-dessous une version Python de la solution, qui n'est pas limitée à la limite 32 bits (ou 64 bits sur un système très récent) pour les nombres entiers en Python. Pour contourner cette limitation, nous allons utiliser une chaîne comme entrée et sortie pour la
factorial
routine et diviser en interne la chaîne en ses chiffres pour pouvoir effectuer la multiplication.
Voici donc le code: la getDigits
fonction divise une chaîne représentant un nombre en ses chiffres, donc "1234" devient [ 4, 3, 2, 1 ]
(l'ordre inverse rend simplement les fonctions increase
et multiply
plus simples). La increase
fonction prend une telle liste et l'augmente d'une unité. Comme son nom l'indique, la multiply
fonction se multiplie, par exemple multiply([2, 1], [3])
retourne [ 6, 3 ]
parce que 12 fois 3 est 36. Cela fonctionne de la même manière que vous multiplieriez quelque chose avec un stylo et du papier.
Enfin, la factorial
fonction utilise ces fonctions d'aide pour calculer la factorielle réelle, par exemple factorial("9")
donne "362880"
comme sortie.
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")
Remarques
En python, un entier n'a pas de limite, donc si vous souhaitez le faire manuellement, vous pouvez simplement le faire
fac = 1
for i in range(2,n+1):
fac *= i
Il y a aussi le très pratique math.factorial(n)
fonction .
Cette solution est évidemment beaucoup plus complexe qu'elle ne devrait l'être, mais elle fonctionne et en fait, elle illustre comment vous pouvez calculer la factorielle au cas où vous seriez limité à 32 ou 64 bits. Donc, même si personne ne croira que c'est la solution que vous avez trouvée pour ce problème simple (au moins en Python), vous pouvez réellement apprendre quelque chose.