Pitone
Di seguito è riportata una versione Python della soluzione, che non è limitata al limite a 32 bit (o 64 bit su un sistema molto recente) per i numeri interi in Python. Per aggirare questa limitazione, dovremo usare una stringa come input e output per la
factorial
routine e dividere internamente la stringa nelle sue cifre per poter eseguire la moltiplicazione.
Quindi ecco il codice: la getDigits
funzione divide una stringa che rappresenta un numero nelle sue cifre, così "1234" diventa [ 4, 3, 2, 1 ]
(l'ordine inverso rende semplicemente le funzioni increase
e multiply
più semplici). La increase
funzione prende un tale elenco e lo aumenta di uno. Come suggerisce il nome, la multiply
funzione si moltiplica, ad es. multiply([2, 1], [3])
Ritorna [ 6, 3 ]
perché 12 volte 3 è 36. Funziona allo stesso modo in cui si moltiplicherebbe qualcosa con carta e penna.
Infine, la factorial
funzione utilizza queste funzioni di supporto per calcolare il fattoriale reale, per esempio factorial("9")
dà "362880"
come uscita.
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")
Appunti
In Python un numero intero non ha un limite, quindi se vuoi farlo manualmente puoi semplicemente farlo
fac = 1
for i in range(2,n+1):
fac *= i
C'è anche la math.factorial(n)
funzione molto conveniente .
Questa soluzione è ovviamente molto più complessa di quanto deve essere, ma funziona e in effetti illustra come è possibile calcolare il fattoriale nel caso in cui si sia limitati da 32 o 64 bit. Quindi, mentre nessuno crederà che questa sia la soluzione che hai trovato per questo semplice problema (almeno in Python), puoi effettivamente imparare qualcosa.