procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2:string;
str,str1:TStrings;
i,j,m,n:Integer;
begin
s1:=Trim(self.Edit1.Text);//这里就是你的字符串‘4,6,8,12,16,17,20,28,29,30,31’
s2:=Trim(self.Edit2.Text);//这里输入8
if (s1='') or (s2='') then
Exit;
str:=TStringList.Create;
str.Clear;
str1:=TStringList.Create;
str1.Clear;
self.getn(s1,'',StrToInt(s2),str);
i:=str.Count;
self.Memo1.Lines.Clear;
for j:=0 to i-1 do
begin
s1:=str.Strings[j];
self.Memo1.Lines.Add(s1);
end;
end;
procedure TForm1.getn(ss, ss1: string; count: Integer; var str: TStrings);
var
i,j,m,n:Integer;
s,s1,s2,s3:string;
str1,str2:TStrings;
begin
str1:=TStringList.Create;
str1.Clear;
str2:=TStringList.Create;
str2.Clear;
ExtractStrings([','],[],PChar(ss),str1);
i:=str1.Count;
if i=0 then
Exit;
for j:=1 to i do
begin
s1:=str1.Strings[j-1];
if ss1='' then
s3:=ss1+s1
else
s3:=ss1+'|'+s1;
str2.Clear;
ExtractStrings(['|'],[],PChar(s3),str2);
if str2.Count=count then
begin
str.Add(s3);
Continue;
end;
s2:='';
for n:=j to i-1 do
s2:=s2+str1.Strings[n]+',';
Self.getn(s2,s3,count,str);
end;
end;
const
BASIC_NUM :Array [0..9] of String = ('0','1','2','3','4','5','6','7','8','9');
//BASIC_OBJ :Array [0..4] of String = ('Red', 'Green', 'Blue', 'White', 'Black');
AMOUNT_NUM :Integer = 10;
//AMOUNT_OBJ :Integer = 5;
PARADE_TYPE :Integer = 0;
COMBINE_TYPE :Integer = 1;
procedure Parade(nBase :Integer; Var sList :TStringList);
var
ssList :TStringList;
nIdx, nSidx :Integer;
begin
ssList := TStringList.Create;
try
if (nBase < 1) then
begin
//do nothing
end else
begin
if (sList.Count = 0) then
begin
for nIdx := 0 to AMOUNT_NUM-1 do
ssList.Add(BASIC_NUM[nIdx]);
end else
begin
for nIdx := 0 to AMOUNT_NUM-1 do
for nSidx := 0 to sList.Count-1 do
ssList.Add(BASIC_NUM[nIdx]+sList.Strings[nSidx]);
end;
Parade(nBase-1, ssList);
end;
if ssList.Count > 0 then
begin
sList.Clear;
sList.Text := ssList.Text;
end;
finally
ssList.Free;
end;
end;
procedure Combine(nBase :Integer; Var sList :TStringList);
var
ssList :TStringList;
nIdx, nSidx :Integer;
begin
ssList := TStringList.Create;
try
if (nBase < 1) then
begin
//do nothing
end else
begin
if (sList.Count = 0) then
begin
//for nIdx := 0 to AMOUNT_OBJ-1 do
for nIdx := 0 to AMOUNT_NUM-1 do
//ssList.Add(BASIC_OBJ[nIdx]);
ssList.Add(BASIC_NUM[nIdx]);
end else
begin
//for nIdx := 0 to AMOUNT_OBJ-1 do
for nIdx := 0 to AMOUNT_NUM-1 do
for nSidx := 0 to sList.Count-1 do
//if (Pos(BASIC_OBJ[nIdx], sList.Strings[nSidx]) = 0) then
if (Pos(BASIC_NUM[nIdx], sList.Strings[nSidx]) = 0) then
//ssList.Add(BASIC_OBJ[nIdx]+','+sList.Strings[nSidx]);
ssList.Add(BASIC_NUM[nIdx]+sList.Strings[nSidx]);
end;
Combine(nBase-1, ssList);
end;
if ssList.Count > 0 then
begin
sList.Clear;
sList.Text := ssList.Text;
end;
finally
ssList.Free;
end;
end;