求生成aaa到zzz的所有字符串的最简易算法,最好是递归! ( 积分: 100 )

  • 主题发起人 主题发起人 bone61
  • 开始时间 开始时间
B

bone61

Unregistered / Unconfirmed
GUEST, unregistred user!
生成结果为
aaa
aab
aac
...
zzz
最好能给个不定位数的算法!
 
只想出来用FOR 循环嵌套,应该还有别的办法, 关注一下
 
用FOR 可以。我做過。別的不清楚了。。。。
 
跟递归没关系吧?用个三层循环就可以了
 
procedure ppp(s:string;
i:integer);
begin
for c:='a' to 'z' do
if i = 3 then

writeln(s+c)
else
ppp(s+c, i+1);
end;

ppp('', 1);
 
procedure TForm1.Button1Click(Sender: TObject);
var
tmpi : integer;
a,b,c : byte;
begin
for tmpi := 0 to 17576-1 do
begin
c := byte('a') + byte(tmpi mod 26);
b := byte('a') + byte((tmpi div 26) mod 26);
a := byte('a') + byte(((tmpi div 26) div 26) mod 26);
memo1.Lines.Add(char(a)+char(b)+char(c));
end;
end;
 
楼主我没有用什么算法,但是实现了这一功能!
procedure TForm1.Button1Click(Sender: TObject);
var
i : Char;
begin
for i := 'a' to 'z' do
begin
Memo1.Lines.Add(i+i+i+#13);
end;
end;
 
楼上的真搞笑!
 
呵呵
其实我最想要的 是不定位数的算法
就是取得从a到zzzzzzzzzzzzzzzzz的所有字符串
 
procedure TForm1.Button1Click(Sender: TObject);
var
tmpi : integer;
tmpc : byte;
tmps : string;
tmpj : integer;
begin
Randomize;
tmps := '';
tmpi := random(9999);
while tmpi>26 do
begin
tmpj := tmpi mod 26;
tmpi := tmpi div 26;
tmps := char(byte('a') + byte(tmpj)) + tmps;
end;
tmps := char(byte('a') + byte(tmpi)) + tmps;
memo1.Lines.Add(tmps);
end;

zzzzzzzzzzzzzzzzz估计你就要用int64吧.
 
type
procatoz = procedure (s:string) of object;
procedure atoz(Len:Integer;
az:procatoz);
var
P:PChar;
C:PByte;
begin
GetMem(p,Len+1);
FillChar(P^,Len,32);
P[Len]:=#0;
P[Len-1]:=chr(ord('a')-1);
C:= PByte(P+Len-1);
while True do
begin
Inc(C^);
if C^=(ord('z')+1) then
begin
repeat
C^:=ord('a');
Dec(C);
if Pointer(c)=Pointer(P-1) then
Exit;
if C^=32 then
C^:=ord('a')
else
Inc(C^);
until C^<>(ord('z')+1);
C:=PByte(P+Len-1);
end;
az(Trim(StrPas(P)));
end;
end;

procedure TForm1.ShowWord(s: string);
begin
Memo1.Lines.Add(s)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
atoz(3,ShowWord);
end;
 
楼主太有面子了,老大都出来了
 
//// 我使用27進制實現這個
var
Form2: TForm2;
implementation
uses math, StrUtils;
{$R *.dfm}

// XSystem = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// max 62 System
// XSystem = '0123456789abcdefghijklmnopqrstuvwxyz';
// max 62 System
// xx = 36;
XSystem: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0';
xx: integer = 27;
function XSystemToDec(v: string;
nSystem: byte): Int64;
var
i, p: integer;
begin
result := 0;
p := 0;
for i := length(v) do
wnto 1 do
begin
result := result + pos(v, xSystem) * trunc(power(nSystem, p));
inc(p);
end;
end;

function DecToXSystem(v: Int64;
nSystem: byte): string;
var
m: int64;
p: integer;
begin
result := '';
while v > 0 do
begin
p := v mod nSystem;
// 1, 27
if p = 0 then
p := 1;
// cary
result := XSystem[p] + result;
v := v div nSystem;
// 27 div 27 = 1
end;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
a, b, i: integer;
begin
a := xsystemtodec('A', xx);
b := xsystemtodec('ZZZ', xx);
for i := a to b do
listbox1.Items.Add( DecToXSystem(i, xx) );
end;
 
还没有结帐呀?用个三层循环不好吗:
var
i,j,k:char;
begin
for i:='a' to 'z' do
begin
for j:='a' to 'z' do
begin
for k:='a' to 'z' do
begin
s:=i+k+j;
memo1.lines.add(s);
end;
end;
end;
end;
这样写多爽啊,只是多占了点内存而已
 
连老大都出来了,楼主太有面子了。
 
顶。太厉害!
 
后退
顶部