0

我需要在 Delphi 7 中编写一个函数,列出 3 个整数的所有可能组合(不重复),使用范围从 1 到 8。例如:

123 124 125 ... 412 413 415 ... 874 875 876

此函数将用于比较目的,所以如果它尽可能快就更好了。

请,有人可以给出一个想法(如果可能的话,用一些代码示例)?

谢谢!


好吧,这就是我到目前为止所得到的。请,如果有人有任何提示可以使它更好(提高性能,减少代码,...),请帮助我。再次感谢!

Function IsNumOnSet(Max, Num: Integer): Boolean;
var
  X, Y, Z: Integer;
Begin
  Result := False;
  For X := 1 to Max Do
    For Y := 1 to Max Do
      For Z := 1 to Max Do
        If (X <> Y) and (X <> Z) and (Y <> Z) Then
          If (IntToStr(X) + IntToStr(Y) + IntToStr(Z) = IntToStr(Num)) Then
          Begin
            Result := True;
            Exit;
          end;
end;

这是新的和完成的功能,在 Ken 的帮助下。将来可能对其他人有用。谢谢!

Function IsNumOnSet(const Min, Max, Num: Integer): Boolean;
var
  X, Y, Z: Integer;
Begin
  Result := False;
  For X := Min to Max Do
    For Y := Min to Max Do
      For Z := Min to Max Do
        If (X <> Y) and (X <> Z) and (Y <> Z) Then
          If (X * 100 + Y * 10 + Z = Num) Then
          Begin
            Result := True;
            Exit;
          end;
end;

如果有人有更好的想法,请告诉我们!

4

2 回答 2

3

您可以在没有循环的情况下解决此问题。

提取您号码中的三位数字,检查它们是否不同,并检查它们是否在最小、最大范围内。

uses Math;

function IsNumOnSet(min,max,num : Integer) : Boolean;
var
  d0,d1,d2 : Integer;
begin
  d0 := num mod 100;
  d1 := (num div 10) mod 10;
  d2 := num div 100;
  Result :=
    (d0 <> d1) and (d0 <> d2) and (d1 <> d2) and
    InRange(d0,min,max) and
    InRange(d1,min,max) and
    InRange(d2,min,max);
end;
于 2013-04-07T07:17:44.303 回答
2

这是一个使用 Litbox 和编辑框的小演示。

var
  Form1: TForm1;
  mystring                                : string;

implementation

{$R *.dfm}

procedure genstrings
          (lowchar                        : char;
           highchar                       : char;
           var outstring                  : string
          );
var
  char1                                   : char;
  char2                                   : char;
  char3                                   : char;
begin
  outstring := '';
  for char1 := lowchar to highchar do
    for char2 := lowchar to highchar do
      if char1 <> char2 then
        for char3 := lowchar to highchar do
      if (char1 <> char3) and (char2 <> char3) then
        outstring := outstring + ',' + char1 + char2 + char3;
  delete(outstring,1,1)
end;


procedure TForm1.Edit1Change(Sender: TObject);
begin with edit1 do begin
  if length(text) = 3 then
  begin
    if pos(text,mystring) > 0 then
      color := cllime
    else
      color := clred;
    if listbox1.Items.IndexOf(text) >= 0 then
      font.color := clblack
    else
      font.color := clwhite;
  end
  else
  begin
    color := claqua;
    font.Color := clfuchsia;
  end;


end;end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  genstrings('1','8',mystring);
  listbox1.Items.CommaText := mystring;
  edit1change(nil);
end;

end.

genstrings生成字符串并将它们编译成逗号分隔的列表。列表被加载到listbox1- 都在创建表单时。

自然地,列表框可​​以直接加载并listbox.commatext用于提取完整列表。

更改编辑框时,如果其中包含的文本不完全是 3 个字符,则编辑框颜色将更改为蓝色的紫红色。

如果提供的字符串正好是 3 个字符长,则使用两种不同的机制来验证条目。

  • 第一个验证是对逗号分隔的有效子字符串的简单 POS。如果找到字符串,则编辑框颜色变为石灰,否则变为红色。
  • 第二个验证是尝试在列表框中查找文本(这实际上是 TStringList 的一种可见形式)。如果找到,则编辑框字体颜色变为黑色,否则变为白色。

至于速度和可靠性——在这么小的演示中,速度真的无关紧要。我敢说 POS 方法比 Indexof 方法 FWIW 更快。真正的测试是真正的应用程序。一个字符串能容纳所有的目标元素吗?

自然地,输入7,1example 将在 POS 实现中达到目标,因为 '7,1' 是一个子字符串。这个演示很容易治愈(pos... mod 5) = 1,但这是一个附带问题。真的取决于我们不知道的东西——真正的目的是什么。例如,如果该条目确实在一个编辑框中,并且该编辑框实际上是一个掩码编辑,则可以轻松控制字符的输入。

于 2013-04-07T07:58:02.313 回答