将Excel或Google电子表格的所有组合相加

将Excel或Google电子表格的所有组合相加,excel,math,google-sheets,Excel,Math,Google Sheets,我需要创建一个电子表格,在那里我将输入几个(17)不同的数字,并在它们之间有所有可能的总和组合。例如1、2、3、4……: 1+2 1+3 1+4 2+3 2+4 3+4 ..... 如果我也能知道组合来自哪两个数字,那就太好了。如果A2:A18有17个数字 B1(标题): B2: 这将给出一个17*17的所有不同组合总和表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5

我需要创建一个电子表格,在那里我将输入几个(17)不同的数字,并在它们之间有所有可能的总和组合。例如1、2、3、4……:

1+2
1+3
1+4
2+3
2+4
3+4
.....

如果我也能知道组合来自哪两个数字,那就太好了。

如果A2:A18有17个数字

B1(标题):

B2:

这将给出一个17*17的所有不同组合总和表:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
如果A2:A18有17个数字

B1(标题):

B2:

这将给出一个17*17的所有不同组合总和表:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 这是用于使用VBA的Excel

A1Q1中列出17个值。然后运行此宏:

Option Explicit

Sub ListSubsets()
    Dim Items(1 To 17) As Variant
    Dim CodeVector() As Integer
    Dim i As Long, kk As Long
    Dim lower As Long, upper As Long
    Dim NewSub As String
    Dim done As Boolean
    Dim OddStep As Boolean
    kk = 3
    OddStep = True
    lower = LBound(Items)
    upper = UBound(Items)
    For i = lower To upper
        Items(i) = Cells(1, i)
    Next i

    ReDim CodeVector(lower To upper) 'it starts all 0
    Application.ScreenUpdating = False
    Do Until done
        'Add a new subset according to current contents
        'of CodeVector

        NewSub = ""
        For i = lower To upper
            If CodeVector(i) = 1 Then
                If NewSub = "" Then
                    NewSub = "'=" & Items(i)
                Else
                    NewSub = NewSub & "+" & Items(i)
                End If
            End If
        Next i
        If NewSub = "" Then NewSub = "{}" 'empty set
        Cells(kk, 2) = NewSub
        Cells(kk, 3).Formula = Mid(NewSub, 2)
        kk = kk + 1
        'now update code vector
        If OddStep Then
            'just flip first bit
            CodeVector(lower) = 1 - CodeVector(lower)
        Else
            'first locate first 1
            i = lower
            Do While CodeVector(i) <> 1
                i = i + 1
            Loop
            'done if i = upper:
            If i = upper Then
                done = True
            Else
                'if not done then flip the *next* bit:
                i = i + 1
                CodeVector(i) = 1 - CodeVector(i)
            End If
        End If
        OddStep = Not OddStep 'toggles between even and odd steps
    Loop
    Application.ScreenUpdating = True
End Sub
选项显式
子列表子集()
尺寸标注项目(1至17)作为变型
Dim CodeVector()作为整数
我和你一样长,kk和你一样长
昏暗的下半身长,上半身长
作为字符串的Dim NewSub
Dim作为布尔值完成
变步长为布尔值
kk=3
OddStep=True
下限=磅(项目)
上限=UBound(项目)
对于i=从低到高
项目(i)=单元格(1,i)
接下来我
ReDim CodeVector(从低到高)'它启动所有0
Application.ScreenUpdating=False
干到做完
'根据当前内容添加新子集
码向量的性质
NewSub=“”
对于i=从低到高
如果码向量(i)=1,则
如果NewSub=“”,则
NewSub=“”=”&项目(i)
其他的
NewSub=NewSub&“+”&项目(i)
如果结束
如果结束
接下来我
如果NewSub=“”,则NewSub=“{}”为空集
单元(kk,2)=NewSub
单元格(kk,3)。公式=Mid(NewSub,2)
kk=kk+1
'现在更新代码向量
如果是这样的话
“只需翻转第一位
CodeVector(下)=1-CodeVector(下)
其他的
'首先查找第一个1
i=较低
Do While码向量(i)1
i=i+1
环
'如果i=上限,则完成:
如果i=上限,则
完成=正确
其他的
'如果未完成,则翻转*下一个*位:
i=i+1
码向量(i)=1-码向量(i)
如果结束
如果结束
OddStep=Not OddStep'在偶数步和奇数步之间切换
环
Application.ScreenUpdating=True
端接头
组合将从B4向下显示,相关总和将显示在D列中:

改编自。

注:

这在我的旧笔记本电脑上运行大约需要4分钟。这是使用VBA的Excel

A1Q1中列出17个值。然后运行此宏:

Option Explicit

Sub ListSubsets()
    Dim Items(1 To 17) As Variant
    Dim CodeVector() As Integer
    Dim i As Long, kk As Long
    Dim lower As Long, upper As Long
    Dim NewSub As String
    Dim done As Boolean
    Dim OddStep As Boolean
    kk = 3
    OddStep = True
    lower = LBound(Items)
    upper = UBound(Items)
    For i = lower To upper
        Items(i) = Cells(1, i)
    Next i

    ReDim CodeVector(lower To upper) 'it starts all 0
    Application.ScreenUpdating = False
    Do Until done
        'Add a new subset according to current contents
        'of CodeVector

        NewSub = ""
        For i = lower To upper
            If CodeVector(i) = 1 Then
                If NewSub = "" Then
                    NewSub = "'=" & Items(i)
                Else
                    NewSub = NewSub & "+" & Items(i)
                End If
            End If
        Next i
        If NewSub = "" Then NewSub = "{}" 'empty set
        Cells(kk, 2) = NewSub
        Cells(kk, 3).Formula = Mid(NewSub, 2)
        kk = kk + 1
        'now update code vector
        If OddStep Then
            'just flip first bit
            CodeVector(lower) = 1 - CodeVector(lower)
        Else
            'first locate first 1
            i = lower
            Do While CodeVector(i) <> 1
                i = i + 1
            Loop
            'done if i = upper:
            If i = upper Then
                done = True
            Else
                'if not done then flip the *next* bit:
                i = i + 1
                CodeVector(i) = 1 - CodeVector(i)
            End If
        End If
        OddStep = Not OddStep 'toggles between even and odd steps
    Loop
    Application.ScreenUpdating = True
End Sub
选项显式
子列表子集()
尺寸标注项目(1至17)作为变型
Dim CodeVector()作为整数
我和你一样长,kk和你一样长
昏暗的下半身长,上半身长
作为字符串的Dim NewSub
Dim作为布尔值完成
变步长为布尔值
kk=3
OddStep=True
下限=磅(项目)
上限=UBound(项目)
对于i=从低到高
项目(i)=单元格(1,i)
接下来我
ReDim CodeVector(从低到高)'它启动所有0
Application.ScreenUpdating=False
干到做完
'根据当前内容添加新子集
码向量的性质
Sub PairsOnly()
    Dim Items(1 To 17) As Variant
    Dim i As Long, j As Long, k As Long
    Dim lower As Long, upper As Long
    lower = LBound(Items)
    upper = UBound(Items)
    k = 2

    For i = lower To upper
        Items(i) = Cells(1, i)
    Next i

    For i = lower To upper - 1
        For j = i + 1 To upper
            Cells(k, 1) = Items(i) & "," & Items(j)
            Cells(k, 2) = Items(i) + Items(j)
            k = k + 1
        Next j
    Next i
End Sub