Python
Nachfolgend finden Sie eine Python-Version der Lösung, die nicht auf das 32-Bit-Limit (oder 64-Bit-Limit auf einem neueren System) für Ganzzahlen in Python beschränkt ist. Um diese Einschränkung zu umgehen, werden wir eine Zeichenfolge als Eingabe und Ausgabe für die
factorial
Routine verwenden und die Zeichenfolge intern in ihre Ziffern aufteilen, um die Multiplikation durchführen zu können.
Hier ist der Code: Die getDigits
Funktion teilt eine Zeichenfolge, die eine Zahl darstellt, in ihre Ziffern auf, sodass "1234" wird [ 4, 3, 2, 1 ]
(die umgekehrte Reihenfolge vereinfacht nur die Funktionen increase
und multiply
). Die increase
Funktion nimmt eine solche Liste und erhöht sie um eins. Wie der Name schon sagt, multiply
multipliziert sich die Funktion, z. B. wird multiply([2, 1], [3])
zurückgegeben, [ 6, 3 ]
weil 12 mal 3 gleich 36 ist. Dies funktioniert genauso, als würden Sie etwas mit Stift und Papier multiplizieren.
Dann endlich, die factorial
verwendet Funktion diese Hilfsfunktionen die tatsächlichen faktorielles zu berechnen, zum Beispiel factorial("9")
gibt "362880"
als Ausgabe.
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")
Anmerkungen
In Python gibt es für eine Ganzzahl kein Limit. Wenn Sie dies also manuell tun möchten, können Sie dies einfach tun
fac = 1
for i in range(2,n+1):
fac *= i
Es gibt auch die sehr bequeme math.factorial(n)
Funktion.
Diese Lösung ist offensichtlich weitaus komplexer als nötig, funktioniert jedoch und zeigt in der Tat, wie Sie die Fakultät berechnen können, wenn Sie auf 32 oder 64 Bit begrenzt sind. Obwohl niemand glauben wird, dass dies die Lösung für dieses einfache (zumindest in Python) Problem ist, können Sie tatsächlich etwas lernen.