Надо уточнять условия... Народ скоро подтянется, потому уточню сам: Уравнение вида A*x+B*y=z, где x,y и z задаются пользователем, а A и B - подбирает программа Самое простое - прямой перебор всех значений. Еще непонятно: Следует ли включать отрицательные числа(обычно при решении уравнений их включают)? Если да, то нужно задать им какие-нибудь пределы, иначе будут ответы вида: -1728222*5+1234573*7=901 что затянет расчеты. В твоей проге заблудился, и поступил просто: заново написал алгоритм решение этого уравнения перебором, с отрицательными числами и пределом от -(z/min(x,y) до +(z/min(x,y): Add(MultiElement,3999161,441,154) { @Hint=#71:Контейнер, где происходит поиск вариантов. Как его заменить на формулу?| @Color=65280 AddHint(101,-23,189,39,@Hint) } BEGIN_SDK Add(EditMulti,10915475,28,14) { EventCount=1 WorkCount=1 Width=790 Height=592 link(doWork1,9469443:doEvent1,[(47,20)(47,104)]) } Add(GlobalVar,16417337,280,28) { Name="5" } Add(GlobalVar,10253595,378,28) { Name="901" } Add(GlobalVar,6418287,329,28) { Name="7" } Add(For,12847677,315,168) { link(onEvent,7329328:doWork2,[]) link(onStop,3905679:doFor,[(359,181)(359,209)]) link(End,15147173:Var2,[]) } Add(For,3905679,371,203) { Start=-1 Step=-1 link(onEvent,7329328:doWork3,[(417,209)]) link(End,11520419:Var2,[]) } Add(Math,6979100,322,98) { OpType=7 ResultType=0 link(onResult,5024388:doOperation,[]) link(Op1,5203248:Var1,[(328,65)]) } Add(Math,10772387,280,98) { OpType=38 link(onResult,6979100:doOperation,[]) link(Op1,9932103:Var2,[]) link(Op2,4098004:Var1,[(293,58)]) } Add(Math,5024388,378,98) { OpType=2 Op1=-1 ResultType=0 link(onResult,2045220:doClear,[]) } Add(For,1753849,161,168) { link(onEvent,12242655:doWork2,[]) link(onStop,260790:doFor,[(205,181)(205,209)]) link(End,15147173:Var1,[(174,145)]) } Add(For,260790,217,203) { Start=-1 Step=-1 link(onEvent,12242655:doWork3,[(263,209)]) link(onStop,2110592:doEnum,[(262,216)(262,251)]) link(End,11520419:Var1,[(230,152)]) } Add(GetDataEx,11520419,378,147) { link(Data,5024388:Result,[]) } Add(GetDataEx,15147173,322,140) { link(Data,6979100:Result,[]) } Add(Hub,9469443,126,98) { link(onEvent1,10772387:doOperation,[]) link(onEvent2,1753849:doFor,[(154,111)(154,174)]) } Add(Memory,3798140,273,168) { link(onData,12847677:doFor,[]) } Add(Memory,13654006,427,168) { link(onData,15831707:doOperation,[]) } Add(HubEx,12242655,259,168) { link(onEvent,3798140:doValue,[]) } Add(HubEx,7329328,413,168) { link(onEvent,13654006:doValue,[]) } Add(Math,15831707,476,168) { OpType=2 ResultType=0 link(onResult,6505895:doOperation,[]) link(Op2,15889674:Var2,[]) } Add(GetDataEx,4098004,329,53) { link(Data,6418287:Var,[]) } Add(Math,6505895,525,168) { OpType=2 ResultType=0 link(onResult,12050430:doOperation,[]) link(Op1,15666798:Var2,[]) link(Op2,13174020:Var2,[]) } Add(GetDataEx,9932103,280,49) { link(Data,16417337:Var,[]) } Add(Math,12050430,574,168) { ResultType=0 link(onResult,8154227:doCompare,[]) link(Op2,15831707:Result,[(587,156)(565,156)(565,207)(482,207)]) } Add(If_else,8154227,616,168) { link(onTrue,3114042:doString,[]) link(Op2,13113232:Var2,[]) } Add(GetDataEx,5203248,378,60) { link(Data,10253595:Var,[]) } Add(StrList,2045220,735,91) { } Add(GetDataEx,15666798,525,146) { Angle=3 link(Data,3798140:Value,[(517,151)(517,243)(279,243)]) } Add(GetDataEx,13174020,532,49) { Angle=3 link(Data,9932103:Var3,[]) } Add(GetDataEx,15889674,483,53) { Angle=3 link(Data,4098004:Var3,[]) } Add(FormatStr,3114042,658,168) { DataCount=5 Mask="%1*%2+%3*%4=%5" link(onFString,2045220:doAdd,[(716,174)(716,97)]) link(Str1,15666798:Var3,[(664,151)]) link(Str2,13174020:Var3,[(671,54)]) link(Str3,13654006:Value,[(678,156)(653,156)(653,214)(433,214)]) link(Str4,15889674:Var3,[(685,58)]) link(Str5,13113232:Var3,[(692,65)]) } Add(GetDataEx,13113232,623,60) { Angle=3 link(Data,5203248:Var3,[]) } Add(ArrayEnum,2110592,749,245) { link(onItem,10915475:onEvent1,[(802,251)(802,20)]) link(Array,2045220:Array,[]) } END_SDK
Тут только код зеленого блока... Если отрицательные не нужны - алгоритм еще проще... ЗЫ возможно это не то, что ты хотел - я так в твоей проге и не разобрался - слишком много наворочено в зеленом блоке
|