Что нового

[Математика] Функция для вычисления наибольшего общего делителя

Diamond

Меценат
Меценат
AutoIt: 3.3.14.2
Версия: 1.0

Категория: Математика

Описание: Функция для вычисления наибольшего общего делителя между двумя целыми числами.
В примере три варианта функции. Рекурсивная, обычная, и компактная с использованием Ternary операторов.

Возможное применение: Вычисление соотношения сторон экрана монитора или изображений.

Код/Пример:
Код:
Global $iW = @DesktopWidth
Global $iH = @DesktopHeight

Global $iDiv = _Nod3($iW, $iH)

MsgBox(0, "Наибольший общий делитель: " & $iDiv, "Соотношение сторон для текущего разрешения экрана:" & @LF & $iW / $iDiv & ' x ' & $iH / $iDiv)




; #FUNCTION# =====================================================================================================================
; Имя..................: _Nod
; Описание ............: Функция вычисляет наибольший общий делитель.
; Синтаксис............: _Nod($a, $b)
; Параметры ...........: $a, $b - Делимое (int)
; Возвращаемое значение: Наибольший общий делитель
; Автор ...............: Diamond
; Изменено.............:
; Замечания ...........: Используется Рекурсия
; См. также ...........:
; Ссылка ..............;
; Пример ..............;
;================================================================================================================================
Func _Nod($a, $b)
	$a = Mod($a, $b)
	If $a = 0 Then
		Return $b
	Else
		Return _Nod($b, $a)
	EndIf
EndFunc   ;==>_Nod

; #FUNCTION# =====================================================================================================================
; Имя..................: _Nod2
; Описание ............: Функция вычисляет наибольший общий делитель.
; Синтаксис............: _Nod2($a, $b)
; Параметры ...........: $a, $b - Делимое (int)
; Возвращаемое значение: Наибольший общий делитель
; Автор ...............: Diamond
; Изменено.............:
; Замечания ...........: Нет
; См. также ...........:
; Ссылка ..............;
; Пример ..............:
;================================================================================================================================
Func _Nod2($a, $b)
	Local $iTmp
	While $a <> 0 And $b <> 0
		$iTmp = $a
		$a = Mod($a, $b)
		$b = Mod($b, $iTmp)
	WEnd
	Return $a + $b
EndFunc   ;==>_Nod2

; #FUNCTION# ;=====================================================================================================================
; Имя..................: _Nod3
; Описание ............: Функция вычисляет наибольший общий делитель.
; Синтаксис............: _Nod3($a, $b)
; Параметры ...........: $a, $b - Делимое (int)
; Возвращаемое значение: Наибольший общий делитель
; Автор ...............: Diamond
; Изменено.............:
; Замечания ...........: Используются Ternary операторы
; См. также ...........:
; Ссылка ..............;
; Пример ..............:
;================================================================================================================================
Func _Nod3($a, $b)
	While $a And $b
		Execute($a>$b?Assign('a', Mod($a, $b)):Assign('b', Mod($b, $a)))
	WEnd
	Return $a + $b
EndFunc   ;==>_Nod3

Дополнительно:
В качестве дополнительного примера, Утилита - Калькулятор, которая основана на этой функции.
Выводит список всевозможных разрешений в соответствии с заданными параметрами.
Если Вам часто приходиться обрезать изображения в графическом редакторе но при этом важно сохранить пропорции.
Или нужно вывести список разрешений которые соответствуют условиям кратности (актуально для некоторых видео-кодеков). Эта утилита может стать неплохой шпаргалкой.


История версий:
1.0

Источник: autoit-script.ru
Автор(ы): Diamond
 
Верх