测试集合中是否存在数字的排列
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
我正在尝试列出所有 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