关于排列组合的一个问题?(100分)

  • 主题发起人 主题发起人 mlong
  • 开始时间 开始时间
M

mlong

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]A到M一共多少种组合,并如把具体的组合放入表data中
 
有个方法:
FOR I:=A TO M-1 DO
FOR J:=I+1 TO M DO
BEGIN
TABLE.APPEND
TABLE.FIELDBYNAME('').ASSTRING=A+B;(下一次循环为A+C、……)
TABLE.POST
TABLE.APPEND
TABLE.FIELDBYNAME('').ASSTRING=B+A;下一次循环为C+A、……)
TABLE.POST
END;
 
但3个或4个字母组合呢?
 
是可重复的,还是不重得的。
还有,是不是取任意个元素的组合?
 
A到M的任意字母(2个到(M-A)个)组合,可以重复.
 
给你一个方法,自己测试一下!
但以下方法只能算 'A'-'G'
再大的话,TStrings 就不够用了,因为它的资源分配是有限制的。
这样的话,你必须直接在数据库中操作,可用写文件的方法进行。

procedure TForm1.Button1Click(Sender: TObject);
const
a='A';
b='G';
var
i,j:char;
k,t:integer;
sT,Stt:TStrings;
n:array[a..b] of integer;
begin
memo1.clear;
sT:=TStringList.create;
sTt:=TStringList.create;
for i:=a to b do
begin
st.Add(i);
n:=st.count-1;
end;

for i:=succ(a) to b do
begin
stt.clear;
for j:=a to b do
begin
t:=stt.count;
for k:=n[j] to st.count-1 do
begin
stt.add(j+st[k]);
end;
n[j]:=t;
end;
memo1.Lines.AddStrings(stt);
st.Assign(stt);
end;
st.free;
stt.free;
showmessage(inttostr(memo1.Lines.Count ))
end;
 
后退
顶部