如果生成这样的排列:彩票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 
 
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 
注意的是,其中 的数字可以重复。希望是较快的算法,通用的函数p(m,n).因为可能是10(0-9的数字)选3-7都可能。
我研究了一天了,没有好方法,请高手帮忙,谢谢了!

解决方案 »

  1.   

    排列组合书上都有具体的算法,你这个问题可以具体问题具体分析,其实很简单的,可以用于3D或者排列三的程序里  sNum := '46789';               // s存放你的可选的数字  nLen := length(sNum);  for i := 1 to nLen do
        for j := 1 to nLen do
          for k := 1 to nLen do
            memo1.lines.Add(sNum[i] + sNum[j] + sNum[k]);  // 结果用Memo来显示,你也可以做其它处理
      

  2.   

    接楼上的,用排三列的方法来写:
      mylist:tstrinlist;
      mylist:=tstringlist.create;
    for i:=0  to 9 do 
      for j:=0 to 9 do 
        for k:=0 to 9 do 
        mylist.add(inttostr(i)+inttostr(j)+inttostr(k));  将结果存放到一个stringlist中
      

  3.   

    for i:=0 to 999 do
     listbox1.items.add(formatfloat('000',i));