大家好:
   最近正在写一个33选6的程序,要求就是把1~33个数按无重复排。但是不知道为什么写出来的内容老是有不对的,而且速度非常的慢,现在把我写的程序拿出来,大家帮助看一看,
procedure TForm_dict.FillText ;
var
  aa:array[1..33] of string;
  i,i1,i2,i3,i4,i5,i6:integer;
  m,n,l:integer;
  Ts:TStringList;
begin
    l:=0;
    n:=1;
    for m:=1 to 33 do
    begin
      if TPanel(FindComPonent('Panel'+inttostr(m+1))).Color =clred then
        begin
          aa[n]:=TPanel(FindComPonent('Panel'+inttostr(m+1))).Caption ;
          l:=l+1;
          n:=n+1;
        end ;
    end;
  for i:=1 to 33 do
    if i<10 then
      aa[i]:='0' + inttostr(i) + ' '
    else
      aa[i]:=inttostr(i) + ' ';
  Ts:=TStringList.Create ;
   for i1:=1 to l do begin
    for i2:=i1+1 to l do begin
      for i3:=i2+1 to l do begin
        for i4:=i3+1 to l do begin
          for i5:=i4+1 to l do begin
            for i6:=i5+1 to l do
              begin
                Ts.Add(aa[i1]+aa[i2]+aa[i3]+aa[i4]+aa[i5]+aa[i6]);
              end;
            end;
          end;
        end;
     end;
   end;
  Ts.SaveToFile('Datas\Temp.txt');
  Ts.Free;
end;

解决方案 »

  1.   

    void quick(int *a,int i,int j)

    int m,n,temp; 
    int k; 
    m=i; 
    n=j; 
    k=a[(i+j)/2]; /*选取的参照*/ 
    do { 
    while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/ 
    while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/ 
    if(m<=n) { /*若找到且满足条件,则交换*/ 
    temp=a[m]; 
    a[m]=a[n]; 
    a[n]=temp; 
    m++; 
    n--; 

    }while(m<=n); 
    if(m<j) quick(a,m,j); /*运用递归*/ 
    if(n>i) quick(a,i,n); 

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TList *L;
    int N[7];
    long T=time(0);
    int iIndex;
    AnsiString s;
    T=T % 1000;
    L=new TList();
    try
    {
    Label8->Caption="00";
    Label9->Caption="00";
    Label10->Caption="00";
    Label11->Caption="00";
    Label12->Caption="00";
    Label13->Caption="00";
    Label14->Caption="00";
    Application->ProcessMessages();
    iIndex=0;
    for (int i = 0; i < 33; i++) {
    L->Add((void *)(i+1));
    //Memo1->Lines->Add(i+1);
    }
    for (int m = 0; m <= 5; m++) {
    for (int i = 0; i <= T; i++) {
    random(time(0));
    int j=rand();
    int k=j % L->Count; int iTmp=(int)L->Items[0];
    L->Items[0]=L->Items[k];
    L->Items[k]=(void *)iTmp;
    }
    //Memo1->Lines->Add("-----------------------------");
    //for (int i = 0; i <= L->Count-1; i++) {
    // Memo1->Lines->Add((int)L->Items[i]);
    //} random(time(0));
    int j=rand();
    j=j%L->Count;
    N[m]=(int)L->Items[j];
    L->Delete(j); switch (m) {
    case 0:{
    s.sprintf("%2.2d",N[0]);
    Label8->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    case 1:{
    s.sprintf("%2.2d",N[1]);
    Label9->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    case 2:{
    s.sprintf("%2.2d",N[2]);
    Label10->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    case 3:{
    s.sprintf("%2.2d",N[3]);
    Label11->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    case 4:{
    s.sprintf("%2.2d",N[4]);
    Label12->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    case 5:{
    s.sprintf("%2.2d",N[5]);
    Label13->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    case 6:{
    s.sprintf("%2.2d",N[6]);
    Label14->Caption=s;
    //Application->ProcessMessages();
    //Sleep(10);
    break;
    }
    default:
    ;
    }
    }
    random(N[5]);
    N[6]=rand()%16+1;
    s.sprintf("%2.2d",N[6]);
    Label14->Caption=s;
    quick(N,0,5);
    for (int i = 0;i <= 6; i++) {
       Chart1->SeriesList->Items[i]->AddNull(N[i]);
    } s.sprintf("%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d:%2.2d",N[0],N[1],N[2],N[3],N[4],N[5],N[6]);
    Memo1->Lines->Add(s);
    }
    __finally
    {
    L->Free();
        }
    }
      

  2.   

    For循环太多了
    时间复杂度太大
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Reds:array [1..33] of integer;
      Red,i:integer;
      R,tmp,jieguo:string;
    begin
      randomize;
      for i:=1 to 33 do Reds[i]:=i;
      repeat
      Red:=random(33)+1;
      if Reds[Red]<>-1 then
      begin
        RedS[Red]:=-1;
        if Red<10 then R:='0'+inttostr(Red)
        else R:=inttostr(Red);
      end else
      continue;
      jieguo:=jieguo+R+' ';
      until length(jieguo)=18;
      edit1.Text :=jieguo;//结果在edit1中显示出来
    end;
      

  4.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      ball:TStringList;
      n:integer;
    begin
      ball:=TStringList.Create;
      ball.Duplicates:=dupIgnore;
      ball.Sorted:=true;
      Randomize;
      while ball.Count<6 do
      begin
        n:=Random(33)+1;
        if n<10 then ball.Add('0'+inttostr(n))
        else ball.Add(inttostr(n));
      end;
      ShowMessage(ball.Text);
      ball.Free;
    end;
      

  5.   

    更短的procedure TForm1.Button1Click(Sender: TObject);
    var
      ball:TStringList;
    begin
      ball:=TStringList.Create;
      ball.Duplicates:=dupIgnore;
      ball.Sorted:=true;
      Randomize;
      while ball.Count<6 do ball.Add(Format('%.2d',[Random(33)+1]));
      ShowMessage(ball.Text);
      ball.Free;
    end;
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      tlist:TStringList;
      i,j:integer;
      tarr:array[1..33] of string;
      tstr:string;
    begin
      for i:=1 to 33 do
        tarr[i-1]:=format('%.2d',[i]);
      tlist:=tStringlist.Create;
      for i:=1 to 6 do
      begin
        j:=random(33-i+1)+1;
        tlist.Add(tarr[j]);
        tarr[j]:=tarr[33-i+1];
      end;
      tlist.Sort;
      tstr:=tlist.Strings[0];
      for i:=1 to 5 do
        tstr:=tstr+' '+tlist.Strings[i];
      showmessage(tstr);
    end;
      

  7.   

    剛才有點小毛病,現在沒問題了
    procedure TForm1.Button1Click(Sender: TObject);
    var
      tlist:TStringList;
      i,j:integer;
      tarr:array[1..33] of string;
      tstr:string;
    begin
      for i:=1 to 33 do
        tarr[i-1]:=format('%.2d',[i]);
      tlist:=tStringlist.Create;
      for i:=1 to 6 do
      begin
        j:=random(33-i+1);
        tlist.Add(tarr[j]);
        tarr[j]:=tarr[33-i];
      end;
      tlist.Sort;
      tstr:=tlist.Strings[0];
      for i:=1 to 5 do
        tstr:=tstr+' '+tlist.Strings[i];  tlist.Free;
      showmessage(tstr);
    end;