Pyton
Poniżej znajduje się wersja rozwiązania w języku Python, która nie jest ograniczona do 32-bitowego (lub 64-bitowego w najnowszym systemie) limitu liczb całkowitych w Pythonie. Aby obejść to ograniczenie, użyjemy łańcucha jako danych wejściowych i wyjściowych dla
factorial
procedury i wewnętrznie podzielimy łańcuch na cyfry, aby móc wykonać mnożenie.
Oto więc kod: getDigits
funkcja dzieli ciąg reprezentujący liczbę na swoje cyfry, więc staje się „1234” [ 4, 3, 2, 1 ]
(odwrotna kolejność tylko upraszcza funkcje increase
i multiply
). increase
Funkcja przyjmuje taką listę i zwiększa się o jeden. Jak sama nazwa wskazuje, multiply
funkcja się zwielokrotnia, np. multiply([2, 1], [3])
Zwraca[ 6, 3 ]
ponieważ 12 razy 3 to 36. Działa to w taki sam sposób, jak pomnożysz coś za pomocą pióra i papieru.
Następnie factorial
funkcja wykorzystuje te funkcje pomocnicze do obliczenia faktycznej silni, na przykład factorial("9")
podaje "362880"
jako wynik.
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")
Notatki
W Pythonie liczba całkowita nie ma limitu, więc jeśli chcesz to zrobić ręcznie, możesz to zrobić
fac = 1
for i in range(2,n+1):
fac *= i
Istnieje również bardzo wygodna math.factorial(n)
funkcja.
To rozwiązanie jest oczywiście o wiele bardziej skomplikowane, niż musi być, ale działa i faktycznie ilustruje, w jaki sposób można obliczyć silnię w przypadku ograniczenia przez 32 lub 64 bity. Więc chociaż nikt nie uwierzy, że jest to rozwiązanie, które wymyśliłeś dla tego prostego (przynajmniej w Pythonie) problemu, możesz się czegoś nauczyć.