【问题标题】:Delphi - How to list the combination of numbers in a specific range?Delphi - 如何列出特定范围内的数字组合?
【发布时间】:2013-04-07 15:58:02
【问题描述】:

我需要在 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;

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

【问题讨论】:

  • 您能否edit 您的问题并发布您迄今为止尝试过但对您不起作用的内容,并就您在使用该代码时遇到的问题提出一个具体问题? “谁能给我一些密码?”这里真的不是一个可以接受的问题。谢谢。
  • efg's lab 中有一个排列部分。
  • Ken,我想我已经解释了这个问题,我并没有要求完整的代码,只是一个想法和例子......无论如何,我已经添加了一些我写的代码,但也许它可以更改为最大化性能。谢谢!也谢谢你,TOndrej!
  • 肯,很好!谢谢!
  • @Ken White:建议你看这里stackoverflow.com/questions/15850355/…的历史。

标签: delphi random combinations


【解决方案1】:

你可以在没有循环的情况下解决这个问题。

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

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;

【讨论】:

  • 我在上一个问题中已经说过了。消息似乎没有通过。
  • @DavidHeffernan,在这里我可以理解这个问题,这是一个初学者。为你+1。顺便说一句,我查看了InRange 的实现。不是我在专业包装中所期望的。提交 QC 以进行改进。
  • 谢谢。 InRange 有什么问题?我从这里看不到它,但记得它内嵌了两个比较。
  • @DavidHeffernan,当前的实现总是测试这两个限制,即使第一个失败。
  • 哦,真可怜。他们存储给当地人,然后做和。这很奇怪。我想知道为什么。
【解决方案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,1 的输入自然会在 POS 实现中命中目标,因为 '7,1' 是一个子字符串。对于这个演示,(pos... mod 5) = 1 很容易治愈,但这是一个附带问题。真的取决于我们不知道的东西——真正的目的是什么。例如,如果该条目确实在一个编辑框中,而该编辑框实际上是一个掩码编辑,则可以轻松控制字符的输入。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2018-11-19
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多