翻<Pascal语言程序设计>这本书时,在第233页有一道题:
9.29  已知字符集('1','2','3'),生成该字符集上的所有含有n个字符的序列.要求生成的序列中没有任意两个子序是相同的.这道题怎么做?

解决方案 »

  1.   

    少的,简单的可以这样(这是最不好的)for i := 1 to 3 do
    for j := 1 to 3 do
    for k := 1 to 3 do
    begin
      if (i <> j) and (j <> k) and (i <> k ) then ShowMessage(IntToStr(i) + IntToStr(j) + IntToStr(k)) ; 
    end;
      

  2.   

    呵呵,兄弟们啊,要是这么简单我也就不问了.
    他是有N个啊....
    说来好笑,前段时间去朋友那里,他们在开发一个软件,客户对编号有一个要求,为何有这般要求我都还丈二和尚的.那就是用这三个字符来编码,要求每个编码中,这三个字符至少出现一次,而且有十三位啊,要用程序打印出来,不能重复.我就是想啊想,想不出什么好办法来.不过,要是笨方法的话,应当不难吧.
    比如:
    for i:=1111111111111 to 3333333333333
    begin
      db.append;
      db("id") = i;
    end;再来个唯一查询,打印就可以了嘛,是不是?
      

  3.   

    多的全排列 ,From kyee(浪子阿鹏)  ,这是所见的最简单的 procedure StringRank(A, B: String);
    var
       C: Char;
       S: String;
       i, Len: Integer;
    begin
       Len := Length(A);
       if Len = 0 then
          StringPrint(B)
       else for i := 1 to Len do
       begin
          C := A[i];
          S := Copy(A, 1, i - 1);
          if Pos(C, S) = 0 then
             StringRank(S + Copy(A, i + 1, Len - i), C + B);
       end;
    end;调用 : StringRank('1234','') //得到1234的全排列
      

  4.   

    我做过类似的作业,不同的是用的是0,1,2,显示N个数,我的方法是
    for i := 0 to n - 1 do
    begin
      将数 i 转换为三进制数 打印
    end;
    你的情况类似的吧,也可以用上面的方法,只不过打印的时候用3替换0就可以了