piton
Aşağıda, Python'daki tamsayılar için 32 bit (veya çok yeni bir sistemde 64 bit) sınırıyla sınırlı olmayan bir Python sürümü bulunmaktadır. Bu sınırlamanın üstesinden gelmek için,
factorial
rutin için giriş ve çıkış olarak bir dize kullanmalı ve çarpmayı gerçekleştirebilmek için dizeyi basamaklarına böleriz.
İşte kod: getDigits
işlev, rakamı içindeki bir sayıyı temsil eden bir dizeyi ayırır, böylece "1234" olur [ 4, 3, 2, 1 ]
(ters sıra sadece increase
ve multiply
işlevlerini kolaylaştırır). increase
Fonksiyonu böyle bir liste ve tek artışları onu alır. Adından da anlaşılacağı gibi, multiply
işlev çoğalır, örneğin 12 çarpı 3 36 olduğu için multiply([2, 1], [3])
geri döner. [ 6, 3 ]
Bu, kalem ve kağıtla bir şeyi çarptığınız gibi çalışır.
Son olarak, factorial
fonksiyon bu faktöriyeli gerçek faktöriyeli hesaplamak için kullanır, örneğin çıktısı olarak factorial("9")
verir "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")
notlar
Python'da bir tamsayının bir sınırı yoktur, bu yüzden bunu manuel olarak yapmak istiyorsanız,
fac = 1
for i in range(2,n+1):
fac *= i
Ayrıca çok kullanışlı bir math.factorial(n)
fonksiyon var.
Bu çözüm, olması gerekenden çok daha karmaşıktır, ancak işe yarar ve aslında 32 veya 64 bit ile sınırlı olmanız durumunda faktöriyel nasıl hesaplayabileceğinizi gösterir. Kimse bunun bu basit (en azından Python'da) problem için bulduğunuz çözüm olduğuna inanmayacak olsa da, aslında bir şeyler öğrenebilirsiniz.