firex
AutoIT Гуру
- Сообщения
- 943
- Репутация
- 208
Всем привет =)
Не знаю зачем я это сделал (видимо было скучно).
Концепция проста - умножение/сложение происходит по принципу "столбиком".
Я более чем уверен, что есть уже готовые библиотеки(которые в свою очередь и результат быстрее получают), но ведь свое всего приятнее :3
А ко всему прочему это можно было реализовать и лучше, но я выбрал самый "простой" путь.
Код/Пример:
Не знаю зачем я это сделал (видимо было скучно).
Концепция проста - умножение/сложение происходит по принципу "столбиком".
Я более чем уверен, что есть уже готовые библиотеки(которые в свою очередь и результат быстрее получают), но ведь свое всего приятнее :3
А ко всему прочему это можно было реализовать и лучше, но я выбрал самый "простой" путь.
Код/Пример:
Код:
#Include <Array.au3>
#Include <String.au3>
MsgBox(64,"test calc", _Concept_Multiply(_Concept_MString("13", Random(40,60)),_Concept_MString("37", Random(40,60))) )
;$_Factor << $_Initial
;$_Initial & $_Factor - Only string
;$_Quotient - Not using
;!max_len = 1024???
;!used _Concept_AdditionAy
;#Return int(in str).
Func _Concept_Multiply( $_Initial, $_Factor, $_Quotient = 1 )
Local $I, $S, $_P_Info, $_T_Buffer = 0, $SimMatrixLol[1] = [0]
Local $Temp, $Temp2, $Temp3, $Temp4, $Temp5, $Temp6, $Temp7, $Temp8 = ""
Dim $_P_Info[3] = [0, StringLen($_Initial), StringLen($_Factor)]
If Not IsString($_Initial) Or Not IsString($_Factor) Then _
Return SetError( 1, 0, "E")
If StringInStr($_Initial, ".") Or StringInStr($_Factor, ".") Then _
Return SetError( 2, 0, "D")
If $_P_Info[1] < $_P_Info[2] Or $_P_Info[2] > 1024 Then _
Return SetError( 2, 0, "L")
For $I = $_P_Info[2] To 1 Step -1
$Temp5 = _Concept_MString("0", $_P_Info[2] - $I)
For $S = $_P_Info[1] To 1 Step -1
$Temp = Int(StringMid($_Factor,$I,1) * StringMid($_Initial,$S,1)) + $_T_Buffer
If $Temp > 9 And $S > 1 Then
$Temp2 = StringLeft(String($Temp), 1)
$Temp3 = Int( $Temp2 )
$Temp4 = $Temp - ($Temp3 * 10) ;Остаток
$_T_Buffer = $Temp3 ;В память
Else
$Temp4 = String($Temp)
$_T_Buffer = 0
EndIf
$Temp6 = $Temp4 & $Temp5
$Temp5 = $Temp6
Next
_ArrayInsert($SimMatrixLol, 1, $Temp5 )
Next
$Temp8 = $SimMatrixLol[1]
For $I = 2 To UBound($SimMatrixLol)-1 Step 1
$Temp8 = _Concept_Addition($Temp8, $SimMatrixLol[$I])
Next
Return $Temp8
EndFunc
;$_Summand1 << $_Summand2
;$_Summand1 & $_Summand2 - Only string
;$_Quotient - Not using
;!max_len = 1024???
;#Return int(in str).
Func _Concept_Addition( $_Summand1, $_Summand2, $_Quotient = 1 )
Local $I, $S, $_T_Buffer = 0, $_A_Start = 0, $_A_Len = 0
Local $Temp, $Temp2, $Temp3, $Temp4, $Temp5, $Temp6, $Temp7 = ""
Dim $_P_Info[3] = [0, StringLen($_Summand1), StringLen($_Summand2)]
If $_P_Info[1] < $_P_Info[2] Or $_P_Info[2] > 1024 Then _
Return SetError( 2, 0, "L")
$_Summand2 = _Concept_MString("0", $_P_Info[1] - $_P_Info[2]) & $_Summand2
For $S = $_P_Info[1] To 1 Step -1
$Temp = Int(StringMid($_Summand2,$S,1) + StringMid($_Summand1,$S,1)) + $_T_Buffer
If $Temp > 9 And $S > 1 Then
$Temp2 = StringLeft(String($Temp), 1)
$Temp3 = Int( $Temp2 )
$Temp4 = $Temp - ($Temp3 * 10) ;Остаток
$_T_Buffer = $Temp3 ;В память
Else
$Temp4 = String($Temp)
$_T_Buffer = 0
EndIf
$Temp6 = $Temp4 & $Temp7
$Temp7 = $Temp6
Next
Return $Temp7
EndFunc
Func _Concept_MString($_String, $_Factor)
Local $i, $r = ""
For $i = 1 To $_Factor
$r &= $_String
Next
Return $r
EndFunc