请教大家一道书本中的练习题.

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

这道题怎么做?
...全文
77 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjlsmail 2003-01-03
  • 打赏
  • 举报
回复
少的,简单的可以这样(这是最不好的)

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;
diruser 2003-01-03
  • 打赏
  • 举报
回复
用集合进行
Erice 2003-01-03
  • 打赏
  • 举报
回复
实际上是一个排列组合的问题 如:
123
132
213
231
312
321
一共6个组合
给分
apache57 2003-01-03
  • 打赏
  • 举报
回复
我做过类似的作业,不同的是用的是0,1,2,显示N个数,我的方法是
for i := 0 to n - 1 do
begin
将数 i 转换为三进制数 打印
end;
你的情况类似的吧,也可以用上面的方法,只不过打印的时候用3替换0就可以了
wjlsmail 2003-01-03
  • 打赏
  • 举报
回复
哪位可以再写点别的较好的全排列的算法吗 ?

谢谢
wjlsmail 2003-01-03
  • 打赏
  • 举报
回复
多的全排列 ,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的全排列
memstone 2003-01-03
  • 打赏
  • 举报
回复
呵呵,兄弟们啊,要是这么简单我也就不问了.
他是有N个啊....
说来好笑,前段时间去朋友那里,他们在开发一个软件,客户对编号有一个要求,为何有这般要求我都还丈二和尚的.那就是用这三个字符来编码,要求每个编码中,这三个字符至少出现一次,而且有十三位啊,要用程序打印出来,不能重复.我就是想啊想,想不出什么好办法来.不过,要是笨方法的话,应当不难吧.
比如:
for i:=1111111111111 to 3333333333333
begin
db.append;
db("id") = i;
end;

再来个唯一查询,打印就可以了嘛,是不是?

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧