例如: 从0-9 a-z(共36个字符)中取出五个,然后把每种组合显示或存为文件
00000
00001
..
..
..
00009
0000a
0000b
..
..
0000z
-------------------------
00010
00011
..
..
00019
0001a
..
..
0001z
00000
00001
..
..
..
00009
0000a
0000b
..
..
0000z
-------------------------
00010
00011
..
..
00019
0001a
..
..
0001z
解决方案 »
- delphi2005IDE中如何使新建窗体默认为宋体,9?
- 求助ADOQuery中数据选择的问题,高分,在线等
- Rave中就没有象QR中的TQRChart那样的图表吗?
- 求助[在线等待,解答立即给分],关于ADOTABLE的使用
- 如何用sql语句将一个表中的所有记录追加到另一个表中?
- 我用paradox数据库,设一表中字段N1为I型,在DBGRID中显示时,这一列的内容左对齐,如何才能使它右对齐呢?
- 组件面板不显示了的原因
- sql数据库在执行SELECT条件查询时最多可提取多少条资料,指标那里有啊?
- 将Paradox7.0(delphi5.0自带的数据库)转换成sql2000。全分奉送。
- 请问哪里有PDF格式的《Delphi 5.0开发人员指南》下载!
- BPL包无法调试(设置断点)的问题,欢迎讨论
- delphi中菜鸟问题 openquery是什么啊,怎么用
var
SourceList: TStringList; ->把目标字符都加到StringList里
DestStr: string;
RandIdx: Integer;
for Idx:= 0 to 4 do
begin
RandIdx:= Random(SourceList.Count - 1);
DestStr:= DestStr + SourceList(RandIdx);
end;ShowMessage(DestStr);
1.可以把目标字符串都写到一个文件里,一个字符一行,然后用StringList.LoadFromFile,以后要加目标字符的话,只要在文件里加就行了;
2.控制长度的话,只要把4改成5、6等等就行了;
你好,谢谢你的解答,但这样的话有二个问题:
第一:用这个随机取stringList的行,有可能会不完整
第二:会有重复现象
function plstr(str:string):Tstringlist;
var
i,j:integer;
len:integer;
cchar:string;
tempstr:string;
templist:Tstringlist;
begin
result:=Tstringlist.create;len:=length(str);
if len=1 then
begin
result.add(str);
exit;
end;for i:=1 to len do
begin
cchar:=str[i]; tempstr:=str;
delete(tempstr,i,1);
templist:=plstr(tempstr);
for j:=1 to templist.Count do
begin
result.Add(cchar+templist[j-1]);
end;
templist.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
i:integer;
len:integer;
strs:Tstringlist;
begin
memo1.Clear;str:=edit1.Text;strs:=plstr(str);
memo1.Lines.Add('=========================');
memo1.Lines.Add(inttostr(strs.Count));
memo1.Lines.Add('=========================');for i:=1 to strs.Count do
begin
memo1.Lines.Add(strs[i-1]);
end;strs.Free;
end;
const
allnum :Integer = 36;
data :Array [0..35] of String = ('0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z');
var
tmpList :TStringList;
i, j :Integer;
begin
tmpList := TStringList.Create;
try
if (bitnum < 1) then
begin
end
else
begin
if (backList.Count = 0) then
begin
for i := 0 to allnum-1 do
tmpList.Add(data[i]);
end
else
begin
for i := 0 to allnum-1 do
for j := 0 to backList.Count-1 do
if (Pos(data[i], backList.Strings[j]) = 0) then
tmpList.Add(data[i]+backList.Strings[j]);
end;
GetStr(bitnum-1, tmpList);
end;
if tmpList.Count > 0 then
begin
backList.Clear;
backList.Text := tmpList.Text;
end;
finally
tmpList.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
st:TStringList;
begin
st := TStringList.Create;
GetStr(5, st);
showmessage(inttostr(st.Count));
st.SaveToFile('d:\aa.txt');
end;//排列组合很多,位数多的话要内存足够大
可以用少量的位数试验
GetStr(2, st);
你好,你这个基本是我要的效果,但是GetStr(2, st)的时候,00 11 22..这样二个一样的不会列进去.烦请帮忙再看下
const
TABLE: array[0..35] of Char = ('0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'); procedure DoIt(AIndex: Integer; const ALeftStr: string);
var
I: Integer;
begin
for I := 0 to High(TABLE) do
if AIndex = ANum - 1 then
AResultList.Append(ALeftStr + TABLE[I])
else
DoIt(AIndex + 1, ALeftStr + TABLE[I])
end; begin
DoIt(0, '')
end;
就用36进制来实现这个,:)//整数转36进制字符,结果放在P-4中,未判断n>=36^5的情况
procedure IntTo36H(n : integer; P : Pointer);
asm
PUSH EDX;
MOV ECX , 36
XOR EDX , EDX
DIV ECX;
POP ECX;
ADD DL , $30
CMP DL , $39
JNA @@Number
ADD DL , $60-$39
@@Number:
MOV [ECX] , DL;
CMP EAX , 0
JZ @@Exit;
MOV EDX , ECX;
DEC EDX;
CALL IntTo36H;
@@Exit:
end;procedure TForm1.Button1Click(Sender: TObject);
var
i , Len : integer;
S : AnsiString;
P : PAnsiChar;
begin
Len := 100;
SetLength(S , 5);
P := Pointer(S);
for i:=0 to Len-1 do begin
PByte(P)^ := $30;
PDWORD(P+1)^ := $30303030;
IntTo36H(i , P+4);
Memo1.Lines.Add(S);
end;
end;