;вычисляет строку равную произведению $sNumber на $iDigit
;$sNumber- строка произвольной длинны, содержащая только цифры (целое положительное число с произвольным количеством знаков)
;$iDigit - 0 или 1 или 2 или 3 или 4 или 5 или 6 или 7 или 8 или 9
;контроля входных праметров нет
Func Mul_By_Digit($sNumber,$iDigit)
$iLen=StringLen($sNumber)
$iCarry=0
$iCurDigit=0
$iMul=0
$sRet=""
for $i=$iLen To 1 step -1
$iMul=(Int(StringMid($sNumber, $i, 1)))*$iDigit+$iCarry
$iCarry= int($iMul/10)
$iCurDigit=Mod($iMul,10)
$sRet=$iCurDigit&$sRet
next
if $iCarry<>0 then
$sRet=$iCarry&$sRet
EndIf
Return $sRet
EndFunc
;складывает два числа произвольной длинны
;$sNumber1,$sNumber2 - строки представляющие числа для сложения
func Add($sNumber1,$sNumber2)
$iLen1=StringLen($sNumber1)
$iLen2=StringLen($sNumber2)
if $iLen2>$iLen1 Then
local $iTemp=$iLen1
$iLen1=$iLen2
$iLen2=$iTemp
local $sTemp=$sNumber1
$sNumber1=$sNumber2
$sNumber2=$sTemp
EndIf
;в $sNumber1- самая длинная строка.
$iCarry=0
$iCurDigit=0
$iSum=0
$iCurNumber2Digit=0
$sRet=""
for $i=1 to $iLen1 step 1
if $i> $iLen2 then
$iCurNumber2Digit=0
Else
$iCurNumber2Digit=Int(StringMid($sNumber2, $iLen2-$i+1, 1))
EndIf
$iSum=$iCurNumber2Digit+Int(StringMid($sNumber1,$iLen1- $i+1, 1))+$iCarry
$iCarry=int($iSum/10);$iCarry=int($iSum > 9)
$iCurDigit=Mod($iSum,10)
$sRet=$iCurDigit&$sRet
Next
if $iCarry<>0 then
$sRet="1"&$sRet
EndIf
Return $sRet
EndFunc
;умножает два целых числа произвольной длинны
;$sNumber1,$sNumber2 - строки представляющие числа для умножения
func Multiply($sNumber1,$sNumber2)
$iLen1=StringLen($sNumber1)
$iLen2=StringLen($sNumber2)
if $iLen2>$iLen1 Then
local $iTemp=$iLen1
$iLen1=$iLen2
$iLen2=$iTemp
local $sTemp=$sNumber1
$sNumber1=$sNumber2
$sNumber2=$sTemp
EndIf
;в $sNumber1- самая длинная строка.
$sRet="0"
$sTmpMul="0"
$sPostfix=""
for $i=$iLen2 to 1 step -1
$sTmpMul=Mul_By_Digit($sNumber1,StringMid($sNumber2,$i, 1))
$sRet=Add($sTmpMul&$sPostfix,$sRet)
$sPostfix=$sPostfix&"0"
Next
Return $sRet
EndFunc
;вычисляет факториал целого числа n
func Fact($n)
if $n<2 Then
return 1
EndIf
return Multiply(Fact($n-1),$n)
EndFunc
ToolTip(Fact(100))
sleep(5000)