我收藏的一个函数,返回的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]

解决方案 »

  1.   

    如果不太大的 话  function CountN(x:Int64):integer;
      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;
      

  2.   

    sl.Lines.Add(s); 改为 sl.Add(s);
      

  3.   

    谢谢,vividw!
    你试了你的算法,结果怎么只有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 
    谢谢,能再改下吗