测试集合中是否存在数字的排列

Test if a permutation of a number exists in a collection

我正在尝试列出所有 3 位数的数字,其中各个数字的总和为给定数字。

到目前为止,我可以 return 使用此 Visual Basic 代码的所有数字的列表:

target = 17
i = 1
j = 1
k = 1

Do While i < 10
    Do While j < 10
        Do While k < 10
            r = i + j + k
            If r = target Then
                If i <> j And j <> k And k <> i Then
                    lsNumbers.Add(i & j & k )
                End If
            End If
            k += 1
        Loop
        If k = 10 Then k = 1
        j += 1
    Loop
    If j = 10 Then j = 1
    i += 1
Loop

但我只想要唯一的、不重复的组合。

例如目标号码 17:

179、197、269、278、287...

我希望能够在将当前号码添加到列表之前测试它,以检查它是否是列表中已有号码的组合 - 因此 197 会因为 179 而失败,而 287 也会失败因为 278

观察

只是好奇,是故意排除 0 数字吗?

要遍历可能的数字,非常适合的指令对是 FOR NEXT。绝对比您使用的 DO WHILE 简单。

  Loop
  If k = 10 Then k = 1
Loop
If j = 10 Then j = 1

循环完成后,迭代器肯定包含 10。IF 是多余的。

解决方案

为了检查一个符合条件的数字是否是唯一的,因为它不是由与已经验证的数字相同的 3 位数字组成,您可以查阅 3-D 数组。如果新数字对应于此数组中的非零元素,则意味着新数字将使用与先前数字相同的数字。这就是拒绝它的理由。

下一个代码在 QBasic 中运行。您可以毫无困难地为 Visual BASIC 重写它。

DIM r%(1 TO 9, 1 TO 9, 1 TO 9)
FOR i% = 1 TO 9
  FOR j% = 1 TO 9
    FOR k% = 1 TO 9
      r%(i%, j%, k%) = 0
    NEXT
  NEXT
NEXT
target% = 17
FOR i% = 1 TO 9
  FOR j% = 1 TO 9
    FOR k% = 1 TO 9
      IF i% + j% + k% = target% THEN
        IF r%(i%, j%, k%) = 0 THEN
          PRINT i% * 100 + j% * 10 + k%; " ";
          r%(i%, j%, k%) = 1  ' Could do without this one because of the ascending order
          r%(i%, k%, j%) = 1
          r%(j%, i%, k%) = 1
          r%(j%, k%, i%) = 1
          r%(k%, i%, j%) = 1
          r%(k%, j%, i%) = 1
        END IF
      END IF
    NEXT
  NEXT
NEXT

这是我输出的有效数字:

179 188 269 278 359 368 377 449 458 467 557 566