Что нового

[Массивы] Убрать ненужных из набора чисел, что бы сумма оставшихся была равной заданному.

akmal18

Новичок
Сообщения
11
Репутация
0
Здравствуйте, уважаемые форумчане. Можете помочь решить задачку? Скажем, нам дано несколько чисел. Из них надо отобрать только те, сумма которых даст нам желаемый результат (то есть, конкретное число). Можно ли реализовать это с помощью AutoIt, Желательно, с GUI.
Пример:
Числа - 1589, 2546, 5432, 6859, 4516, 7852, 9853, 5422, 1749, 6588.
Надо из этих чисел, отобрать только те, сумма которых равно, скажем, на 32741. Заранее спасибо!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
оформи по правилам и в стол заказов.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
На основе функции от AZJIO
http://autoit-script.ru/index.php?topic=6462.msg52949#msg52949

Код:
$Win = GUICreate('Окно', 550, 150, -1, -1)

$Label1 = GUICtrlCreateLabel('Введите числа через запятую', 8, 12, 95, 34, 0)
$Input1 = GUICtrlCreateInput('1589, 2546, 5432, 6859, 4516, 7852, 9853, 5422, 1749, 6588', 110, 12, 410, 24)
$Label2 = GUICtrlCreateLabel('Введите сумму чисел', 8, 52, 95, 34, 0)
$Input2 = GUICtrlCreateInput('32741', 110, 52, 90, 24, 0x2000)
$Button1 = GUICtrlCreateButton('Результат', 8, 92, 95, 24, 0)
$Input3 = GUICtrlCreateInput('', 110, 92, 410, 24)

GUISetState()

While 1
	$msj = Guigetmsg()
	Switch $msj
		Case -3
			Exit
		Case $Button1
			If GUICtrlRead($Input1) <> '' And StringInStr(GUICtrlRead($Input1), ',') > 0 And GUICtrlRead($Input2) <> '' Then
				$string = _DelSum(GUICtrlRead($Input1), GUICtrlRead($Input2))
				GUICtrlSetData($Input3, $string)
			Else
				MsgBox(48, 'Ошибка!', 'Введены неверные данные!')
			EndIf
	EndSwitch
WEnd

Func _DelSum($string, $sum1)
	$Array = StringSplit($string, ',')
	$string = ''
	$sum2 = 0

	While 2
		$aR = _RandomUnique(1, $Array[0], $Array[0] - 1)
		For $i = Ubound($aR) - 1 To 0 Step -1
			$sum2 += $Array[$aR[$i]]
			$string &= $Array[$aR[$i]] & ','
			If $sum2 = $sum1 Then ExitLoop 2
		Next
		$string = ''
		$sum2 = 0
	WEnd

	Return StringTrimRight($string, 1)

EndFunc   ;==>_DelSum

Func _RandomUnique($Min = 0, $Max = 1, $Count = 1)
	Local $i, $k, $ts, $te, $tmp, $tmpNew, $iStep = 0, $nRnd, $iStepErr = 0

	$k = $Max - $Min + 1
	If $Min >= $Max Then Return SetError(1, 0, '')
	If $k < $Count Then Return SetError(2, 0, '')
	If $Count = 1 Then
		Local $aUnique[2] = [1, Random($Min, $Max, 1)]
		Return $aUnique
	EndIf

	Local $aStr[$k]
	For $i = 0 To $k - 1
		$aStr[$i] = $i + $Min
	Next

	If $Count > $k / 2 Then

		Local $iCountExp = $k - $Count
		Assign('\', '', 1)
		While $iStep < $iCountExp
			$nRnd = Random(0, $k - 1, 1)
			If IsDeclared($aStr[$nRnd] & '\') <> -1 Then
				$iStep += 1
				$aStr[$nRnd] = ''
				Assign($aStr[$nRnd] & '\', '', 1)
			Else
				; v===================================v
				$iStepErr += 1
				If $iStepErr > $k / 4 Then
					$d = 0
					For $i = 0 To $k - 1
						If $aStr[$i] Then
							$aStr[$d] = $aStr[$i]
							$d += 1
						EndIf
					Next
					If $d > 0 Then
						ReDim $aStr[$d]
						$k = $d
						$iStepErr = 0
					Else
						ExitLoop
					EndIf
				EndIf
				; ^===================================^
			EndIf
		WEnd
		$d = 0
		Local $aUnique[$k]
		For $i = 0 To $k - 1
			If StringLen($aStr[$i]) Then
				$d += 1
				$aUnique[$d] = $aStr[$i]
			EndIf
		Next
		ReDim $aUnique[$d + 1]
		$aUnique[0] = $d

		; swap
		For $i = 1 To $aUnique[0]
			$iR = Random($i, $aUnique[0], 1)
			If $i = $iR Then ContinueLoop
			If $iR = 0 Then $iR = $aUnique[0]
			$aTmp = $aUnique[$i]
			$aUnique[$i] = $aUnique[$iR]
			$aUnique[$iR] = $aTmp
		Next

	Else

		Local $aUnique[$Count + 1] = [$Count]
		Assign('\', '', 1)
		While $iStep < $Count
			$nRnd = Random(0, $k - 1, 1)
			If IsDeclared($aStr[$nRnd] & '\') <> -1 Then
				$iStep += 1
				$aUnique[$iStep] = $aStr[$nRnd]
				$aStr[$nRnd] = ''
				Assign($aStr[$nRnd] & '\', '', 1)
			Else
				; v===================================v
				$iStepErr += 1
				If $iStepErr > $k / 4 Then
					$d = 0
					For $i = 0 To $k - 1
						If StringLen($aStr[$i]) Then
							$aStr[$d] = $aStr[$i]
							$d += 1
						EndIf
					Next
					If $d > 0 Then
						ReDim $aStr[$d]
						$k = $d
						$iStepErr = 0
					Else
						ExitLoop
					EndIf
				EndIf
				; ^===================================^
			EndIf
		WEnd
	EndIf

	Return $aUnique
EndFunc   ;==>_RandomUnique
 
Автор
A

akmal18

Новичок
Сообщения
11
Репутация
0
WSWR
Отлично! Просто класс! Спасибо огромное!!!
Именно так я себе представлял решение и GUI. Извиняюсь что поздно отвечаю, просто думал что тему удалили, так как не мог её найти сразу. ;D
Ещё раз СПАСИБО!
 
Верх