有一个任意的数字,不能确定数字的大小,也不能确定数字的位数,但是需要将数字一个一个拆开,然后相加,如果数字大于某个设定的数字,那么将前面相加的结果再次拆开一个一个相加,知道满足小于或者等于设定的数字,才停止这个过程。请问怎么编写循环来解决。我目前的方法:首先把这个任意数字看成字符串,然后取得位数,开始使用for循环进行累加,但是只能进行一次,不知道怎样加入到Do循环里面去执行重复的循环累加,直到累加结果符合条件。难题是并不知道这个数字的大小和长短(位数),请高手帮忙解决一下,谢谢
调试欢乐多
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
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
试试下面的程序,做了两次递归,当最大值万一过小自动取最接近的值,短小精悍,呵呵!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