You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选3位数中各位和为指定值且无重复排列的唯一组合

解决方案

方案1:优化循环逻辑(最优,无需额外校验)

核心思路:直接通过约束三个数字的大小关系,从根源上避免生成重复的排列组合,仅生成升序的唯一数字组,同时天然满足三位互不相等的条件,还能大幅减少循环次数。

target = 17
i = 1
' 外层循环控制百位,取值1-9
Do While i < 10
    ' 中层循环控制十位,必须大于百位,避免重复组合
    j = i + 1
    Do While j < 10
        ' 内层循环控制个位,必须大于十位
        k = j + 1
        Do While k < 10
            If i + j + k = target Then
                ' 直接添加,无需判断重复、无需判断三位不等
                lsNumbers.Add(i & j & k)
            End If
            k += 1
        Loop
        j += 1
    Loop
    i += 1
Loop

原逻辑总循环次数为999=729次,优化后仅需循环84次,不会生成任何重复排列的结果,完全符合需求。

方案2:保留原逻辑,新增排列重复校验

如果不想修改原有循环结构,可以新增缓存集合存储已出现的数字排序结果,每次添加前做校验:

target = 17
i = 1
j = 1
k = 1
' 新增缓存集合,存储已出现的排序后数字串
Dim existedCombs As New Collection

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
                    ' 对三位数字排序,生成唯一组合标识
                    Dim digits() As Integer = {i, j, k}
                    Array.Sort(digits)
                    Dim combKey As String = digits(0) & digits(1) & digits(2)
                    ' 校验该组合是否已存在
                    Dim exists As Boolean = False
                    For Each item In existedCombs
                        If item = combKey Then
                            exists = True
                            Exit For
                        End If
                    Next
                    If Not exists Then
                        existedCombs.Add(combKey)
                        lsNumbers.Add(i & j & k)
                    End If
                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

内容的提问来源于stack exchange,提问作者Philip McGeehan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:36:03