Пітон
Нижче представлена версія рішення Python, яка не обмежується обмеженням 32-бітового (або 64-бітного в дуже недавній системі) для цілих чисел у Python. Щоб обійти це обмеження, ми будемо використовувати рядок як вхід і вихід для
factorial
підпрограми і внутрішньо розділити рядок на його цифри, щоб мати змогу виконати множення.
Отже, ось код: getDigits
функція розбиває рядок, що представляє число, на його цифри, тому "1234" стає [ 4, 3, 2, 1 ]
(зворотний порядок просто робить функцію increase
і multiply
простішим). increase
Функція приймає такий список є і збільшує його на одиницю. Як випливає з назви, multiply
функція множиться, наприклад, multiply([2, 1], [3])
повертається, [ 6, 3 ]
тому що 12 разів 3 - це 36. Це працює так само, як ви б перемножували щось із ручкою та папером.
Потім, нарешті, factorial
функція використовує ці допоміжні функції для обчислення фактичного факторіалу, наприклад, factorial("9")
дає "362880"
як його вихід.
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")
Примітки
У python ціле число не має обмеження, тому якщо ви хочете зробити це вручну, ви можете просто зробити
fac = 1
for i in range(2,n+1):
fac *= i
Є також дуже зручна math.factorial(n)
функція.
Це рішення, очевидно, набагато складніше, ніж воно повинно бути, але воно працює, і насправді воно ілюструє, як можна обчислити факторіал, якщо ви обмежені 32 або 64 бітами. Тож поки ніхто не повірить, що це рішення, яке ви придумали для цієї простої (принаймні, в Python) проблеми, ви насправді можете чомусь навчитися.