Python
Di bawah ini adalah versi Python dari solusi, yang tidak terbatas pada batas 32 bit (atau 64 bit pada sistem yang sangat baru) untuk angka integer dalam Python. Untuk mengatasi batasan ini, kita akan menggunakan string sebagai input dan output untuk
factorial
rutin dan secara internal membagi string dalam digit itu untuk dapat melakukan perkalian.
Jadi di sini adalah kodenya: getDigits
fungsi membagi sebuah string yang mewakili angka ke dalam digitnya, jadi "1234" menjadi [ 4, 3, 2, 1 ]
(urutan terbalik hanya membuat increase
dan multiply
fungsinya lebih sederhana). The increase
fungsi mengambil daftar dan meningkat dengan satu tersebut. Seperti namanya, multiply
fungsi ini berlipat ganda, misalnya multiply([2, 1], [3])
kembali [ 6, 3 ]
karena 12 kali 3 adalah 36. Ini berfungsi dengan cara yang sama seperti Anda akan melipatgandakan sesuatu dengan pena dan kertas.
Kemudian akhirnya, factorial
fungsi tersebut menggunakan fungsi pembantu ini untuk menghitung faktorial yang sebenarnya, misalnya factorial("9")
memberi "362880"
sebagai outputnya.
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")
Catatan
Dalam python integer tidak memiliki batas, jadi jika Anda ingin melakukan ini secara manual, Anda bisa melakukannya
fac = 1
for i in range(2,n+1):
fac *= i
Ada juga fungsi yang sangat nyaman math.factorial(n)
.
Solusi ini jelas jauh lebih kompleks daripada yang seharusnya, tetapi itu berfungsi dan bahkan menggambarkan bagaimana Anda dapat menghitung faktorial jika Anda dibatasi oleh 32 atau 64 bit. Jadi, sementara tidak ada yang akan percaya ini adalah solusi yang Anda buat untuk masalah sederhana ini (setidaknya dengan Python), Anda sebenarnya dapat mempelajari sesuatu.