Не хватит окна Immediate для записи всех результатов решения, да и Excel скорей всего зависнет. Вы представляете сколько решений даст такое уравнение с 4 неизвестными? явно больше, чем строк в .xlsx
Не хватит окна Immediate для записи всех результатов решения, да и Excel скорей всего зависнет. Вы представляете сколько решений даст такое уравнение с 4 неизвестными? явно больше, чем строк в .xlsxsboy
Смотря какие начальные данные. Например для целых неотрицательных чисел листа вполне достаточно. Решение в лоб: [vba]
Код
Sub d() Dim arr(1 To 4), dic As Object Dim n&, i&, ii&, iii&, iiii&, t& n = [FindV] Min = [Min] Set dic = CreateObject("Scripting.Dictionary") For i = Min To n / 4 If i / 10 = i \ 10 Then DoEvents: Application.StatusBar = i & ":" & dic.Count For ii = Min To n / 3 If (i * 4 + ii * 3) > n Then Exit For For iii = Min To n / 2 If (i * 4 + ii * 3 + iii * 2) > n Then Exit For For iiii = Min To n / 4 If (i * 4 + ii * 3 + iii * 2 + iiii) > n Then Exit For If (i * 4 + ii * 3 + iii * 2 + iiii) = n Then arr(1) = i: arr(2) = ii: arr(3) = iii: arr(4) = iiii t = t + 1 dic(t) = arr If t > 1048574 Then GoTo 10 End If Next Next Next Next 10 arr1 = dic.items ReDim arr2(1 To dic.Count, 1 To 4) For i = 0 To dic.Count - 1 For ii = 1 To 4 arr2(i + 1, ii) = arr1(i)(ii) Next Next [a2].Resize(UBound(arr2), 4) = arr2 Application.StatusBar = False End Sub
Смотря какие начальные данные. Например для целых неотрицательных чисел листа вполне достаточно. Решение в лоб: [vba]
Код
Sub d() Dim arr(1 To 4), dic As Object Dim n&, i&, ii&, iii&, iiii&, t& n = [FindV] Min = [Min] Set dic = CreateObject("Scripting.Dictionary") For i = Min To n / 4 If i / 10 = i \ 10 Then DoEvents: Application.StatusBar = i & ":" & dic.Count For ii = Min To n / 3 If (i * 4 + ii * 3) > n Then Exit For For iii = Min To n / 2 If (i * 4 + ii * 3 + iii * 2) > n Then Exit For For iiii = Min To n / 4 If (i * 4 + ii * 3 + iii * 2 + iiii) > n Then Exit For If (i * 4 + ii * 3 + iii * 2 + iiii) = n Then arr(1) = i: arr(2) = ii: arr(3) = iii: arr(4) = iiii t = t + 1 dic(t) = arr If t > 1048574 Then GoTo 10 End If Next Next Next Next 10 arr1 = dic.items ReDim arr2(1 To dic.Count, 1 To 4) For i = 0 To dic.Count - 1 For ii = 1 To 4 arr2(i + 1, ii) = arr1(i)(ii) Next Next [a2].Resize(UBound(arr2), 4) = arr2 Application.StatusBar = False End Sub
может я чего не понял, но: 1+628 = 629 2+626 = 628
Заработался... А да - забыл сказать что стоит предохранитель на количество строк - если его убрать и писать в блокнот, или в БД - то выдаст все.SLAVICK
Спасибо, но лучше, как я понял, сделать неизвестные статичными. Не менять их. Подобрать их один раз и хватит. В принципе, я это так себе и оставил.
Спасибо, но лучше, как я понял, сделать неизвестные статичными. Не менять их. Подобрать их один раз и хватит. В принципе, я это так себе и оставил.ant6729