Con trăn
Dưới đây là phiên bản Python của giải pháp, không giới hạn ở giới hạn 32 bit (hoặc 64 bit trên hệ thống rất gần đây) đối với số nguyên trong Python. Để vượt qua giới hạn này, chúng ta sẽ sử dụng một chuỗi làm đầu vào và đầu ra cho
factorial
thường trình và chia chuỗi bên trong các chữ số của nó để có thể thực hiện phép nhân.
Vì vậy, đây là mã: getDigits
hàm chia một chuỗi biểu thị một số thành các chữ số của nó, do đó "1234" trở thành [ 4, 3, 2, 1 ]
(thứ tự ngược lại chỉ làm cho hàm increase
và multiply
hàm đơn giản hơn). Cácincrease
chức năng có danh sách một ví dụ và tăng nó bằng một. Như tên cho thấy, multiply
hàm nhân lên, ví dụ multiply([2, 1], [3])
trả về[ 6, 3 ]
vì 12 lần 3 là 36. Điều này hoạt động theo cách tương tự như bạn sẽ nhân một cái gì đó bằng bút và giấy.
Cuối cùng, factorial
hàm sử dụng các hàm trợ giúp này để tính giai thừa thực tế, ví dụ factorial("9")
cho"362880"
là sản lượng của nó.
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")
Ghi chú
Trong python, một số nguyên không có giới hạn, vì vậy nếu bạn muốn làm điều này bằng tay, bạn có thể làm
fac = 1
for i in range(2,n+1):
fac *= i
Ngoài ra còn rất thuận tiện. math.factorial(n)
chức năng .
Giải pháp này rõ ràng phức tạp hơn nhiều so với yêu cầu, nhưng nó thực sự hiệu quả và thực tế nó minh họa cách bạn có thể tính giai thừa trong trường hợp bạn bị giới hạn bởi 32 hoặc 64 bit. Vì vậy, trong khi không ai tin rằng đây là giải pháp bạn đưa ra cho vấn đề đơn giản này (ít nhất là trong Python), bạn thực sự có thể học được điều gì đó.