Что нового

Сложениею/Умножение без ограничений(AutoIt)

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Всем привет =)
Не знаю зачем я это сделал (видимо было скучно).
Концепция проста - умножение/сложение происходит по принципу "столбиком".
Я более чем уверен, что есть уже готовые библиотеки(которые в свою очередь и результат быстрее получают), но ведь свое всего приятнее :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
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Хм.. Не вижу особого смысла..
Код:
;целая часть от деления
Int(500/3)
;остаток от деления
Mod(500,3)

разве что изредка мелькают ошибки (но сам не встречал)

П.С. Полезно, как разминка для ума))
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
firex
Да, есть уже UDF BigNum в справке как я понимаю работает именно по такому принципу. Хотелось бы разобраться чтобы сделать её побыстрее. Сейчас она вычисляет в 100 раз медленнее, но нет ограничения в точности, может вывести не 15 символов а 200. Ограничение 300 символов вроде.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Скучно было? Вперёд http://autoit-script.ru/index.php/topic,10439.0.html
:laugh: :beer:

Из арифметических операций с большими числами наибольший интерес представляет собой операция деления (что div, что mod). Вот там есть что оптимизировать и ускорять.
;D
 
Верх