-3

从 1 到 88,888,888,每个数字之和等于或小于 8 的组合有哪些?

例如
70000001 = 7+0+0+0+0+0+0+1 = 8 应该在列表中
00000021 = 0+0+0+0+0+0+2+1 = 3 应该在列表中列表。
20005002 = 2+0+0+0+5+0+0+2 = 9 应该在列表中。

Sub Comb()
Dim r As Integer 'Row (to store the number)
Dim i As Integer 'Range
r = 1
For i = 0 To 88888888
If i = 8
'How can I get the sum of the digits on vba?
ActiveSheet.Cells(r, 1) = i
r = r + 1
End If
Else
End Sub
4

3 回答 3

1

...这就是你要找的吗?

Function AddDigits(sNum As String) As Integer

Dim i As Integer

   AddDigits = 0
   For i = 1 To Len(sNum)
      AddDigits = AddDigits + CInt(Mid(sNum, i, 1))
   Next i

End Function

(请记住CStr()在传递给函数的数字上使用。

如果没有,您能否更详细地解释您想要什么。

希望这可以帮助

于 2013-02-11T17:49:53.400 回答
0

您建议的方法几乎是蛮力。在我的机器上,它运行了 6.5 分钟来计算所有数字。到目前为止,我试图找到一种更有效的算法是一个挑战。

这个大约需要 0.5 秒:

Private Const cIntNumberOfDigits As Integer = 9
私有 mStrNum 作为字符串
私有 mRng 作为范围

私有子 GetNumbers()
    将 dblStart 调暗为 Double
    设置 mRng = Range("a1")
    dblStart = 计时器
    mStrNum = 替换(空格(cIntNumberOfDigits),“”,“0”)
    subGetNumbers 8
    Debug.Print (Timer - dblStart) / 10000000, (Timer - dblStart)
结束子


Private Sub subGetNumbers(intMaxSum As Integer, Optional intStartPos As Integer = 1)
    将 i 调暗为整数

    如果 intStartPos = cIntNumberOfDigits 那么
        Mid(mStrNum, intStartPos, 1) = intMaxSum
        mRng.Value = Val(mStrNum)
        设置 mRng = mRng.Offset(1)
        中(mStrNum,intStartPos,1)= 0
        退出子
    万一

    对于 i = 0 到 intMaxSum
        Mid(mStrNum, intStartPos, 1) = CStr(i)
        subGetNumbers intMaxSum - i, intStartPos + 1
    接下来我
    中(mStrNum,intStartPos,1)= 0
结束子

通过使用数组而不是直接写入范围并偏移它,它可以进一步加速大约 10 倍,但现在就足够了!:-)

于 2013-02-11T20:27:19.643 回答
0

作为替代方案,您可以使用如下函数:

Function isInnerLowr8(x As Long) As Boolean
    Dim strX As String, inSum As Long

    isInnerLowr8 = False
    strX = Replace(CStr(x), "0", "")
    For i = 1 To Len(strX)
        Sum = Sum + Val(Mid(strX, i, 1))
        If Sum > 8 Then Exit Function
    Next i
    isInnerLowr8 = True
End Function

现在更改If i = 8If isInnerLowr8(i) Then.

于 2015-04-29T00:11:09.483 回答