我正在尝试计算所有可能的数字组合。但是,我的代码似乎没有计算所有值。
function TForm2.GetNextPerm(s: string): string;
var
i, j, n : integer;
t : Char;
tempString : string;
begin
result := s;
//step 1
i := length(s);
for n := length(s) - 1 downto 1 do begin
i := n;
if (s[i] < s[i + 1]) then break;
end;
if (s[i] >= s[i + 1]) then exit; //already at last permutation
//step 2
j := length(s);
for n := length(s) downto 2 do begin
j := n;
if (s[j] > s[i]) then break;
end;
//step 3
t := s[i];
s[i] := s[j];
s[j] := t;
//step 4
tempString := '';
for n := length(s) downto i + 1 do
tempString := tempString + copy(s, n, 1);
if (tempString <> '') then s := copy(s, 1, i) + tempString;
result := s;
end;
procedure TForm2.Button3Click(Sender: TObject);
var
s, t: string;
i: integer;
x: integer;
hash: string;
o: string;
begin
s := '0123';
o := '0123';
for x := 4 to 9 do
begin
t := GetNextPerm(s);
while (s <> t) do
begin
hash := GenerateHashFromPasscode(s);
if s = '76543210' then
//Do stuff - Never gets here
// if AnsiCompareText(hash, Edit1.Text) =0 then
// ShowMessage('Match! ' + s);
s := t;
t := GetNextPerm(s);
end;
s := o + IntToStr(x);
o := o + IntTOStr(x);
end;
end;
我花了好几个小时试图弄清楚为什么它不能正常工作。也许一双新鲜的眼睛会有所帮助。我们的想法是,它将开始使用数字0123
生成所有可能的组合。之后,它会找到所有可能的数字01234
等组合,一直到012345678
。