我試圖用 3 位數字列出所有數字,其中各個數字的總和為給定的數字。
到目前為止,我可以使用此 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 而失敗
uj5u.com熱心網友回復:
觀察
只是好奇,是故意排除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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/331399.html
上一篇:函式VB.NET到C#的轉換
