我也来凑个热闹…… ====分币凑整 function GetSumCB(sl:TStringList;target,error:Double):TStringlist; var t: TStringlist; procedure GetAdd(tal:Double;R,Left:TStringlist); var i,cnt:Integer; value:Double; s,sA:string; nR,nLeft:TStringlist; begin value:=StrToFloat(Left.Names[Left.Count-1]); cnt:=StrToInt(Left.ValueFromIndex[Left.Count-1]); left.Delete(Left.Count-1); tal:=tal-value; for i:=0 to cnt do begin tal:=tal+value; if tal>target+error then exit; if i>0 then begin s:=FloatToStr(value)+'*'+IntToStr(i); R.Add(s); if Abs(tal-target)<=error then begin if tal=target then sA:='[P]' else sA:='[Dlt='+Format('%.2f', [tal-target])+']'; Result.Add('Method '+IntToStr(Result.Count+1)+sA+':'#13#10+R.Text); end; end; if left.Count>0 then begin nR:=TStringlist.Create; nLeft:=TStringlist.Create; nR.Assign(R); nLeft.Assign(Left); GetAdd(tal,nR,nLeft); nR.Free; nLeft.Free; end; if i>0 then R.Delete(R.Count-1); end; end; begin Result:=TStringlist.Create; t:= TStringlist.Create; GetAdd(0,t,sl); t.Free; if Result.Count=0 then Result.Add('None') else Result.Add('Total '+IntToStr(Result.Count)); end; procedure TForm1.btn1Click(Sender:TObject); var s:TStringList; begin s:=Tstringlist.Create; s.Add('3.1=9'); s.Add('12.7=2'); s.Add('5=5'); MessageDlg(GetSumCB(s,68.3,1).Text,mtWarning, [mbOK],0); end;
for I := Low(DataList) to High(DataList) do begin SetLength(DataList[I], 4); end; for J := 1 to ValueListEditor1.RowCount - 1 do begin DataList[J - 1, 0] := J; DataList[J - 1, 1] := strtofloat(ValueListEditor1.Cells[0, j]); end; DataSort;
vOLD_MY := cxCurrencyEdit1.Value * 2; for I := High(DataList) downto Low(DataList) do begin vDST_MY := cxCurrencyEdit1.Value;
if DataList[I, 1] > vDST_MY then Continue;
for J := I - 1 downto Low(DataList) do begin for k := Low(DataList) to High(DataList) do DataList[k, 2] := 0; DataList[I, 2] := 1; vSUM_MY := 0; vDST_MY := cxCurrencyEdit1.Value; vDST_MY := vDST_MY - DataList[I, 1]; vSUM_MY := DataList[I, 1]; for K := J downto Low(DataList) do begin vDST_MY := vDST_MY - DataList[K, 1]; vSUM_MY := vSUM_MY + DataList[K, 1]; DataList[K, 2] := 1; if vDST_MY <= 0 then Break; end; if (vOLD_MY - cxCurrencyEdit1.Value > vSUM_MY - cxCurrencyEdit1.Value) and (vSUM_MY - cxCurrencyEdit1.Value >= 0) and RadioButton1.Checked then begin for K := Low(DataList) to High(DataList) do DataList[K, 3] := DataList[K, 2]; vOLD_MY := vSUM_MY; end; if (ABS(vOLD_MY - cxCurrencyEdit1.Value) > ABS(vSUM_MY - cxCurrencyEdit1.Value)) and RadioButton2.Checked then begin for K := Low(DataList) to High(DataList) do DataList[K, 3] := DataList[K, 2]; vOLD_MY := vSUM_MY; end; if (vOLD_MY - cxCurrencyEdit1.Value > vSUM_MY - cxCurrencyEdit1.Value) and (vSUM_MY - cxCurrencyEdit1.Value >= 0) and (vSUM_MY - cxCurrencyEdit1.Value < 1) and RadioButton3.Checked then begin for K := Low(DataList) to High(DataList) do DataList[K, 3] := DataList[K, 2]; vOLD_MY := vSUM_MY; end; end;
end;
for I := Low(DataList) to High(DataList) do ValueListEditor1.Cells[1, Trunc(DataList[I, 0])] := InttoStr(Trunc(DataList[I, 3]));
if vOLD_MY <> cxCurrencyEdit1.Value * 2 then begin if vOLD_MY - cxCurrencyEdit1.Value > 0 then RzStatusPane3.Caption := '超額:' + floattostr(Abs(vOLD_MY - cxCurrencyEdit1.Value)) else RzStatusPane3.Caption := '尚缺:' + floattostr(Abs(vOLD_MY - cxCurrencyEdit1.Value)); RzStatusPane2.Caption := '當前:' + floattostr(vOLD_MY); end else begin RzStatusPane3.Caption := ''; RzStatusPane2.Caption := ''; end; RzStatusBar2.Visible := false; RzStatusBar1.Visible := true;