有一个任意的数字,不能确定数字的大小,也不能确定数字的位数,但是需要将数字一个一个拆开,然后相加,如果数字大于某个设定的数字,那么将前面相加的结果再次拆开一个一个相加,知道满足小于或者等于设定的数字,才停止这个过程。请问怎么编写循环来解决。我目前的方法:首先把这个任意数字看成字符串,然后取得位数,开始使用for循环进行累加,但是只能进行一次,不知道怎样加入到Do循环里面去执行重复的循环累加,直到累加结果符合条件。难题是并不知道这个数字的大小和长短(位数),请高手帮忙解决一下,谢谢

解决方案 »

  1.   

    Option ExplicitPrivate Sub Command1_Click()
        MsgBox GetSub(12345, 10)
    End Sub
    Private Function GetSub(ByVal Data As Long, ByVal Max As Long) As Long
       Dim IsBegin As VbMsgBoxResult
       If Max < 10 Then
         IsBegin = MsgBox("最大数小于10,计算后的数据有可能进入死循环。要继续吗?", vbYesNo)
         If IsBegin = vbYes Then
            MsgBox ("为了避免进入死循环,现在对最大数进入了修正。")
            Max = 10
         Else
            GetSub = -1
            Exit Function
         End If
       End If
       
       Dim i As Long
       Dim strData As String
       strData = CStr(Data)
       
       For i = 1 To Len(strData)
         GetSub = GetSub + Mid(strData, i, 1)
       Next
       
       If GetSub > Max Then
          GetSub = GetSub(GetSub, Max)
       End If
       
    End Function
      

  2.   

    就是递归,fvflove在2楼不是给出了办法吗?最多不给判断,直接给出-1退出递归:
    Sub getValue(N As Long, ByVal M As Long)
        
        Dim i As Long
        Dim s As String
        
        If N <= M Then
            Exit Sub
        ElseIf N > M And N < 10 Then
            N = -1
            Exit Sub
        End If
        
        s = CStr(N)
        N = 0
        For i = 1 To Len(s)
            N = N + Int(Mid(s, i, 1))
        Next
        getValue N, M
        
    End SubPrivate Sub Command1_Click()
        Dim lng As Long
        lng = 1235
        Call getValue(lng, 3)
        Debug.Print lng
      

  3.   

    把最大值设成10,万一出现结果为4,你的最大值为5,那这个最大值还是有效的啊。
    试试下面的程序,做了两次递归,当最大值万一过小自动取最接近的值,短小精悍,呵呵!Option ExplicitPrivate Sub Command1_Click()
        MsgBox funResult(1422234555, 10) '//最大值大于等于10,总会找过一个满足的值
        MsgBox funResult(1422234555, 5) '//最大值比较小,可能会找不到值,但会找到一个最近的满足要求的值
    End SubPrivate Function funSum(ByRef strData As String, ByRef lngMax As Long) As Long
        On Error Resume Next '//防止最小值过小溢出
        If strData = "" Then Exit Function '//长度为0时自加完毕
        funSum = Val(Mid(strData, Len(strData), 1)) '//得到一位的值
        strData = Left(strData, Len(strData) - 1) '//长度减小
        funSum = funSum + funSum(strData, lngMax) '//递归求和
        If Err Then lngMax = lngMax + 1 '//如果最大值过小,尝试自加
    End FunctionPrivate Function funResult(ByVal strData As String, ByVal lngMax As Long) As Long
        funResult = funSum(strData, lngMax) '//求结果
        If funResult > lngMax Then funResult = funResult(funResult, lngMax) '//如果结果比最大值大,继续递归
    End Function