AZJIO

Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору embrace909 Ну вот ещё чуть быстрее. Тут чтобы лишнее не проверять проверяется границы для отрицательных результатов. Код: #include "Array.au3" ; Входящие данные Local $iMinY = 100 Local $iMaxY = 700 Local $Sum = 753967.76 ; Сумма $iMinY *= 100 $iMaxY *= 100 $Sum *= 100 Local $kx = 4507 ; коэффициент Local $ky = 109 ; коэффициент Local $aRes[1][3] = [[0]] ; Local $aRes[511][3] = [[510]] ; вариант изначально с запасом, реального выйгрыша нет ; Вычисление $timer = TimerInit() $Y = $Sum / $ky ; вычисляем $Y при $X=0 If $Y <= $iMaxY Then $iMaxY = $Y - 1 ; ограничиваем верхнюю границу Y, после которой X становится отрицательный If $Y <= $iMinY Then Exit MsgBox(0, 'Сообщение', 'Завершаем работу скрипта, потому что X в указанном диапазоне принадлежит отрицательным числам') $j = 0 For $Y = $iMinY To $iMaxY $X = ($Sum - $Y * $ky) / $kx If IsInt($X) Then ; проверяем что X целое число $j += 1 If $j > $aRes[0][0] Then ReDim $aRes[$j * 2 + 1][3] $aRes[0][0] = $j * 2 EndIf $aRes[$j][0] = $X / 100 $aRes[$j][1] = $Y / 100 EndIf Next ReDim $aRes[$j + 1][3] $aRes[0][0] = $j $timer = TimerDiff($timer) _ArrayDisplay($aRes, 'Время ' & Round($timer, 1), -1, 0, '', '|', '№|X|Y') ; проверка что результаты согласно формуле дают нужную сумму For $i = 1 To $j $aRes[$i][2] = $aRes[$i][0] * $kx + $aRes[$i][1] * $ky Next _ArrayDisplay($aRes, 'Проверка', -1, 0, '', '|', '№|X|Y|Сумма') | Код: #include "Array.au3" ; Входящие данные ; Диапазон Y: от 0 до 10 с шагом 0.01 Local $iMinY = 100 Local $iMaxY = 700 Local $nStep = 0.01 Local $kx = 4507 ; коэффициент К1 Local $ky = 109 ; коэффициент К2 Local $Sum = 753967.76 ; Сумма Local $aRes[1][3] = [[0]] ; Вычисление $timer = TimerInit() $Y = $Sum / $ky ; вычисляем $Y при $X=0 If $Y <= $iMaxY Then $iMaxY = $Y - $nStep ; ограничиваем верхнюю границу Y, после которой X становится отрицательный If $Y <= $iMinY Then Exit MsgBox(0, 'Сообщение', 'Завершаем работу скрипта, потому что X в указанном диапазоне принадлежит отрицательным числам') $j = 0 For $Y = $iMinY To $iMaxY Step $nStep $Y = Round($Y, 2) $X = Round(($Sum - $Y * $ky) / $kx, 15) If StringRegExp($X, '^\d+(\.\d{1,2})?$') Then $j += 1 If $j > $aRes[0][0] Then ReDim $aRes[$j * 2 + 1][3] $aRes[0][0] = $j * 2 EndIf $aRes[$j][0] = $X $aRes[$j][1] = $Y EndIf Next ReDim $aRes[$j + 1][3] $aRes[0][0] = $j $timer = TimerDiff($timer) _ArrayDisplay($aRes, 'Результат ' & Round($timer, 2), -1, 0, '', '|', '№|X|Y') ; проверка что результаты согласно формуле дают нужную сумму For $i = 1 To $j $aRes[$i][2] = $aRes[$i][0] * $kx + $aRes[$i][1] * $ky Next _ArrayDisplay($aRes, 'Проверка', -1, 0, '', '|', '№|X|Y|Сумма') |
| Всего записей: 4616 | Зарегистр. 03-05-2006 | Отправлено: 09:47 17-04-2013 | Исправлено: AZJIO, 10:27 17-04-2013 |
|