Hallo,
da ich irgendwie nirgendwo einen Fakultätsrecher gefunden habe der mit AutoIt geschrieben ist, habe ich mir mal überlegt einen eigenen zu schreiben. Der hier rechnet jede Fakultät aus, bei sehr großen Zahlen benötigt er allerdings extrem lange:
Spoiler anzeigen
#include <String.au3>
[/autoit] [autoit][/autoit] [autoit]Global $Zahl = InputBox('Fakultäts rechner', 'Gebe bitte eine Zahl ein von der die Fakultät berechnet werden soll:')
$Time = TimerInit()
MsgBox(0, '', _Fakultaet($Zahl) & @CRLF & @CRLF & 'Es wurden ' & TimerDiff($Time)/1000 & ' Sekunden benötigt!')
#region Functions
[/autoit] [autoit][/autoit] [autoit]Func _Fakultaet($iNumber)
Local $sBetween = 1
For $iZahl = 1 To $iNumber Step 1
ConsoleWrite($iZahl & @CRLF)
$sBetween = _Mul($iZahl, $sBetween)
Next
Return $sBetween
EndFunc
Func _Zero($Number)
Local $sResultNumber = ''
For $i = 1 To $Number
$sResultNumber &= '0'
Next
Return $sResultNumber
EndFunc
Func _Mul($sStringNum_1, $sStringNum_2)
[/autoit] [autoit][/autoit] [autoit]Local $Array[StringLen($sStringNum_1) + 1]
[/autoit] [autoit][/autoit] [autoit]$sStringNum_1 = String($sStringNum_1)
$sStringNum_2 = String($sStringNum_2)
Local $sSplit_1, $sSplit_2
Local $sResult
$sSplit_1 = StringSplit($sStringNum_1, '')
$sSplit_2 = StringSplit($sStringNum_2, '')
Local $sBetweenResult, $sBetweenResult2, $sBetween
[/autoit] [autoit][/autoit] [autoit]For $i_1 = 1 To $sSplit_1[0] Step 1
For $i_2 = $sSplit_2[0] To 1 Step -1
$sBetweenResult = $sSplit_1[$i_1] * $sSplit_2[$i_2] + $sBetween
$sBetween = ''
If $sBetweenResult >= 10 Then
$sBetween = StringTrimRight(String($sBetweenResult), 1)
$sBetweenResult = StringTrimLeft($sBetweenResult, StringLen($sBetweenResult) - 1)
EndIf
$sBetweenResult2 = $sBetweenResult & $sBetweenResult2
Next
$Array[$i_1] = $sBetween & $sBetweenResult2 & _Zero($sSplit_1[0] - $i_1)
$sBetweenResult2 = ''
$sBetween = ''
Next
$sBetween = 0
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To UBound($Array) - 1
$sBetweenOld = $sBetween
$sBetween = _Add($sBetween, $Array[$i])
Next
Return $sBetween
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _Add($sStringNum_1, $sStringNum_2)
[/autoit] [autoit][/autoit] [autoit]$sStringNum_1 = String($sStringNum_1)
$sStringNum_2 = String($sStringNum_2)
Local $Len_1 = StringLen($sStringNum_1)
Local $Len_2 = StringLen($sStringNum_2)
If $Len_2 > $Len_1 Then $sStringNum_1 = _Zero($Len_2 - $Len_1) & $sStringNum_1
If $Len_1 > $Len_2 Then $sStringNum_2 = _Zero($Len_1 - $Len_2) & $sStringNum_2
Local $sSplit_1, $sSplit_2
Local $sResult
$sSplit_1 = StringSplit($sStringNum_1, '')
$sSplit_2 = StringSplit($sStringNum_2, '')
Local $sBetweenResult = 0, $sBetween = 0
[/autoit] [autoit][/autoit] [autoit]For $i = $sSplit_1[0] To 1 Step -1
$sBetweenResult = Number($sSplit_1[$i]) + Number($sSplit_2[$i]) + Number($sBetween)
$sBetween = 0
If $sBetweenResult >= 10 Then
$sBetween = StringTrimRight(String($sBetweenResult), 1)
$sBetweenResult = StringTrimLeft($sBetweenResult, StringLen($sBetweenResult) - 1)
EndIf
$sResult &= $sBetweenResult
Next
If $sBetween <> 0 Then
$sResult = $sBetween & _StringReverse($sResult)
Else
$sResult = _StringReverse($sResult)
EndIf
Return $sResult
EndFunc
#endregion Functions
[/autoit]