我收藏的一个函数,返回的TstringList中,列出了p(m,n)所有排列.
用个全局变量为:
DataBuf:array[1..22] of char; function RangeList(const m,n: Integer): TStringList;
type
TNode = record
d: Integer;
Used: array of Boolean;
end;
var
Stack: array of TNode;
Top: Integer;
i,j: Integer;
s: string;begin
if m>n then
Exit;
SetLength(stack,m);
for i:=1 to m do
SetLength(stack[i-1].Used,n); //setlength(a,n);a下标应该从0..n-1
ZeroMemory(Stack,sizeof(Stack));
Result:=TStringList.Create;
Top:=0;
Stack[0].d:=-1; while Top>=0 do
begin
while Stack[Top].d<n-1 do
begin
Inc(Stack[Top].d);
if not Stack[Top].Used[Stack[Top].d] then
if Top=m-1 then
begin
s:='';
for i:=0 to Top do
s:=s+DataBuf[Stack[i].d];
Result.Append(s)
end
else
begin
Inc(Top);
Stack[Top].d:=-1;
for i:=0 to n-1 do
Stack[Top].Used[i]:=Stack[Top-1].Used[i];
Stack[Top].Used[Stack[Top-1].d]:=True;//#1
end
end;
Dec(Top);
end
end;比如p(3,10),如果要求组合中,数字可以重复,应该怎么改啊????[:(]
就是可以出现111,122,212,这样的排列。也就是每取一个数字后,再取数字时,仍然可以取上次取的数字。
我看不懂上面的函数,望高手帮忙,多谢![:D]
用个全局变量为:
DataBuf:array[1..22] of char; function RangeList(const m,n: Integer): TStringList;
type
TNode = record
d: Integer;
Used: array of Boolean;
end;
var
Stack: array of TNode;
Top: Integer;
i,j: Integer;
s: string;begin
if m>n then
Exit;
SetLength(stack,m);
for i:=1 to m do
SetLength(stack[i-1].Used,n); //setlength(a,n);a下标应该从0..n-1
ZeroMemory(Stack,sizeof(Stack));
Result:=TStringList.Create;
Top:=0;
Stack[0].d:=-1; while Top>=0 do
begin
while Stack[Top].d<n-1 do
begin
Inc(Stack[Top].d);
if not Stack[Top].Used[Stack[Top].d] then
if Top=m-1 then
begin
s:='';
for i:=0 to Top do
s:=s+DataBuf[Stack[i].d];
Result.Append(s)
end
else
begin
Inc(Top);
Stack[Top].d:=-1;
for i:=0 to n-1 do
Stack[Top].Used[i]:=Stack[Top-1].Used[i];
Stack[Top].Used[Stack[Top-1].d]:=True;//#1
end
end;
Dec(Top);
end
end;比如p(3,10),如果要求组合中,数字可以重复,应该怎么改啊????[:(]
就是可以出现111,122,212,这样的排列。也就是每取一个数字后,再取数字时,仍然可以取上次取的数字。
我看不懂上面的函数,望高手帮忙,多谢![:D]
var
I: Integer; //一个数的比特位值为1的位数 33位整数
begin
Result:=0;
while x >0 do
begin
Result:= Result+ (x and $01 );
x:= x shr 1;
end;
end;
----
//初始化
sl:=TStringList.Create;
m:=10;
n:=4;
max:= $01 shl (m - 1);
i:=1;
j:=0;//生成所有组合
while i < max do begin
if CountN(i) = n then begin //记录 选取 n 的。
for j := 0 to m do
if ( ( i shr j ) and $01 ) = 1 then
s:=s+IntToStr(1+j)+','; //生成组合序列
sl.Lines.Add(s);
end ;
Inc(i);
s:='';
end;
sl.Free;
你试了你的算法,结果怎么只有84个,应该是丢了一些组合的。而且你写的是组合的情况,我要的是排列,而且可以重复,以10选3为例,得到的结果应该是如下这样共1000个:
0 0 0
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8
0 0 9
0 1 0
0 1 1
0 1 2
0 1 3
0 1 4
0 1 5
0 1 6
0 1 7
0 1 8
0 1 9
0 2 0
0 2 1
0 2 2
0 2 3
0 2 4
0 2 5
0 2 6
0 2 7
0 2 8
0 2 9
0 3 0
0 3 1
0 3 2
0 3 3
0 3 4
0 3 5
0 3 6
0 3 7
0 3 8
0 3 9
0 4 0
0 4 1
0 4 2
0 4 3
0 4 4
0 4 5
0 4 6
0 4 7
0 4 8
0 4 9
0 5 0
0 5 1
0 5 2
0 5 3
0 5 4
0 5 5
0 5 6
0 5 7
0 5 8
0 5 9
0 6 0
0 6 1
0 6 2
0 6 3
0 6 4
0 6 5
0 6 6
0 6 7
0 6 8
0 6 9
0 7 0
0 7 1
0 7 2
0 7 3
0 7 4
0 7 5
0 7 6
0 7 7
0 7 8
0 7 9
0 8 0
0 8 1
0 8 2
0 8 3
0 8 4
0 8 5
0 8 6
0 8 7
0 8 8
0 8 9
0 9 0
0 9 1
0 9 2
0 9 3
0 9 4
0 9 5
0 9 6
0 9 7
0 9 8
0 9 9
1 0 0
1 0 1
1 0 2
1 0 3
1 0 4
1 0 5
1 0 6
1 0 7
1 0 8
1 0 9
1 1 0
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 1 7
1 1 8
1 1 9
1 2 0
1 2 1
1 2 2
1 2 3
1 2 4
1 2 5
1 2 6
1 2 7
1 2 8
1 2 9
1 3 0
1 3 1
1 3 2
1 3 3
1 3 4
1 3 5
1 3 6
1 3 7
1 3 8
1 3 9
1 4 0
1 4 1
1 4 2
1 4 3
1 4 4
1 4 5
1 4 6
1 4 7
1 4 8
1 4 9
1 5 0
1 5 1
1 5 2
1 5 3
1 5 4
1 5 5
1 5 6
1 5 7
1 5 8
1 5 9
1 6 0
1 6 1
1 6 2
1 6 3
1 6 4
1 6 5
1 6 6
1 6 7
1 6 8
1 6 9
1 7 0
1 7 1
1 7 2
1 7 3
1 7 4
1 7 5
1 7 6
1 7 7
1 7 8
1 7 9
1 8 0
1 8 1
1 8 2
1 8 3
1 8 4
1 8 5
1 8 6
1 8 7
1 8 8
1 8 9
1 9 0
1 9 1
1 9 2
1 9 3
1 9 4
1 9 5
1 9 6
1 9 7
1 9 8
1 9 9
2 0 0
2 0 1
2 0 2
2 0 3
2 0 4
2 0 5
2 0 6
2 0 7
2 0 8
2 0 9
2 1 0
2 1 1
2 1 2
2 1 3
2 1 4
2 1 5
2 1 6
2 1 7
2 1 8
2 1 9
8 0 8
8 0 9
8 1 0
8 1 1
8 1 2
8 1 3
8 1 4
8 1 5
8 1 6
8 1 7
8 1 8
8 1 9
8 2 0
8 2 1
8 2 2
8 2 3
8 2 4
8 2 5
8 2 6
8 2 7
8 2 8
8 2 9
8 3 0
8 3 1
8 3 2
8 3 3
8 3 4
8 3 5
8 3 6
8 3 7
8 3 8
8 3 9
8 4 0
8 4 1
8 4 2
8 4 3
8 4 4
8 4 5
8 4 6
8 4 7
8 4 8
8 4 9
8 5 0
8 5 1
8 5 2
8 5 3
8 5 4
8 5 5
8 5 6
8 5 7
8 5 8
8 5 9
8 6 0
8 6 1
8 6 2
8 6 3
8 6 4
8 6 5
8 6 6
8 6 7
8 6 8
8 6 9
8 7 0
8 7 1
8 7 2
8 7 3
8 7 4
8 7 5
8 7 6
8 7 7
8 7 8
8 7 9
8 8 0
8 8 1
8 8 2
8 8 3
8 8 4
8 8 5
8 8 6
8 8 7
8 8 8
8 8 9
8 9 0
8 9 1
8 9 2
8 9 3
8 9 4
8 9 5
8 9 6
8 9 7
8 9 8
8 9 9
9 0 0
9 0 1
9 0 2
9 0 3
9 0 4
9 0 5
9 0 6
9 0 7
9 0 8
9 0 9
9 1 0
9 1 1
9 1 2
9 1 3
9 1 4
9 1 5
9 1 6
9 1 7
9 1 8
9 1 9
9 2 0
9 2 1
9 2 2
9 2 3
9 2 4
9 2 5
9 2 6
9 2 7
9 2 8
9 2 9
9 3 0
9 3 1
9 3 2
9 3 3
9 3 4
9 3 5
9 3 6
9 3 7
9 3 8
9 3 9
9 4 0
9 4 1
9 4 2
9 4 3
9 4 4
9 4 5
9 4 6
9 4 7
9 4 8
9 4 9
9 5 0
9 5 1
9 5 2
9 5 3
9 5 4
9 5 5
9 5 6
9 5 7
9 5 8
9 5 9
9 6 0
9 6 1
9 6 2
9 6 3
9 6 4
9 6 5
9 6 6
9 6 7
9 6 8
9 6 9
9 7 0
9 7 1
9 7 2
9 7 3
9 7 4
9 7 5
9 7 6
9 7 7
9 7 8
9 7 9
9 8 0
9 8 1
9 8 2
9 8 3
9 8 4
9 8 5
9 8 6
9 8 7
9 8 8
9 8 9
9 9 0
9 9 1
9 9 2
9 9 3
9 9 4
9 9 5
9 9 6
9 9 7
9 9 8
9 9 9
谢谢,能再改下吗