Private Sub Command1_Click() Dim n(1 To 5), i, f As Boolean Dim num, inpt, grp inpt = 100 grp = 5 While Not f For i = 1 To grp n(i) = Int(Rnd * inpt) If n(i) < 10 Then num = 0: Exit For num = num + n(i) Next If num = inpt Then f = True Else num = 0 Wend For i = 1 To grp Debug.Print n(i); " "; Next Debug.Print
End Sub
Private Sub Command1_Click() Dim lngNum As Long Dim lngMin As Long Dim lngMax As Long Dim a() As Long Dim lngSum As Long Dim lngY As Long Dim i As Integer Dim j As Integer
For i = 0 To UBound(a) a(i) = Int((lngMax - lngMin + 1) * Rnd + lngMin) lngSum = lngSum + a(i) Next i
lngY = lngNum - lngSum
For i = 1 To Abs(lngY) a(j) = a(j) + 1 * lngY / Abs(lngY) j = j + 1 If j > UBound(a) Then j = 0 Next i
For i = 0 To UBound(a) Debug.Print a(i) Next i
End Sub
Option ExplicitSub Main() f 100, 5, 10 End SubSub f(ByVal Total As Long, ByVal Count As Long, ByVal Limit As Long) Dim a() As Long Dim lSum As Long Dim lBase As Long Dim lRemain As Long Dim i As Long
'先在范围 [0,Limit) 之间生成随机数' ReDim a(Count - 1) Randomize For i = 0 To Count - 1 a(i) = Int(Rnd() * Limit) lSum = lSum + a(i) Next
Dim iInput As Long '输入的整数 Dim iCount As Long '份数(即除数) '以上2个变量相当于传入的参数
Dim iInt As Long '相除后的取整结果(也可以说是平均数) Dim iAvg As Long '平均数 Dim iMod As Long '余数 Dim i As Long Dim iAdd As Long Dim iRes() As Long
iInput = Val(Text1.Text) iCount = Val(Text2.Text) iInt = Int(iInput / iCount) iMod = iInput Mod iCount iAdd = 1
'分4种情况 ReDim iRes(1 To iCount) As Long Select Case iCount Mod 2 Case 0 '份数是偶数 If iMod = 0 Then '没有余数,即可以被整除 (1) For i = 1 To iCount / 2 iRes(i) = iInt + iAdd iRes(iCount - i + 1) = iInt - iAdd iAdd = iAdd + 1 Next Else '有余数 (2) For i = 1 To iCount / 2 If iAdd = iMod + 1 Then iAdd = iAdd + 1 '关键点: 考虑余数的作用下产生重复数 iRes(i) = iInt + iAdd + IIf(i = 1, iMod, 0) iRes(iCount - i + 1) = iInt - iAdd iAdd = iAdd + 1 Next End If Case Else '份数是奇数 If iMod = 0 Then '没有余数,即可以被整除 (3) iRes(Int(iCount / 2) + 1) = iInt For i = 1 To Int(iCount / 2) iRes(i) = iInt + iAdd iRes(iCount - i + 1) = iInt - iAdd iAdd = iAdd + 1 Next Else '有余数 (4) iRes(Int(iCount / 2) + 1) = iInt + iMod For i = 1 To Int(iCount / 2) If iAdd = iMod Then iAdd = iAdd + 1 '关键点: 考虑余数的作用下产生重复数 iRes(i) = iInt + iAdd iRes(iCount - i + 1) = iInt - iAdd iAdd = iAdd + 1 Next End If End Select
iMod = 0 Debug.Print String(10, "=") & " Begin = " & Str(iInput) & " / " & Str(iCount) For i = 1 To iCount iMod = iMod + iRes(i) Debug.Print Trim(Str(iRes(i))) Next Debug.Print "合计: " & Trim(Str(iMod)) Debug.Print String(10, "=") & " End = " & Str(iInput) & " / " & Str(iCount)
Private Sub Command1_Click()
Dim n(1 To 5), i, f As Boolean
Dim num, inpt, grp
inpt = 100
grp = 5
While Not f
For i = 1 To grp
n(i) = Int(Rnd * inpt)
If n(i) < 10 Then num = 0: Exit For
num = num + n(i)
Next
If num = inpt Then f = True Else num = 0
Wend
For i = 1 To grp
Debug.Print n(i); " ";
Next
Debug.Print
End Sub
Dim lngNum As Long
Dim lngMin As Long
Dim lngMax As Long
Dim a() As Long
Dim lngSum As Long
Dim lngY As Long
Dim i As Integer
Dim j As Integer
lngNum = Text1
lngMin = lngNum / Text2 - Text3
lngMax = lngNum / Text2 + Text3
Randomize
ReDim a(Text2 - 1)
For i = 0 To UBound(a)
a(i) = Int((lngMax - lngMin + 1) * Rnd + lngMin)
lngSum = lngSum + a(i)
Next i
lngY = lngNum - lngSum
For i = 1 To Abs(lngY)
a(j) = a(j) + 1 * lngY / Abs(lngY)
j = j + 1
If j > UBound(a) Then j = 0
Next i
For i = 0 To UBound(a)
Debug.Print a(i)
Next i
End Sub
f 100, 5, 10
End SubSub f(ByVal Total As Long, ByVal Count As Long, ByVal Limit As Long)
Dim a() As Long
Dim lSum As Long
Dim lBase As Long
Dim lRemain As Long
Dim i As Long
'先在范围 [0,Limit) 之间生成随机数'
ReDim a(Count - 1)
Randomize
For i = 0 To Count - 1
a(i) = Int(Rnd() * Limit)
lSum = lSum + a(i)
Next
'根据随机数的和、目标和求出所有数追加的基数'
lBase = (Total - lSum) \ Count
'将余数部分调整到随机数中'
lRemain = Total - lSum - lBase * Count
For i = 0 To Count - 2
If a(i) + lRemain >= Limit Then
lRemain = (a(i) + lRemain) - (Limit - 1)
a(i) = Limit - 1
Else
a(i) = a(i) + lRemain
lRemain = 0
Exit For
End If
Next
a(Count - 1) = a(Count - 1) + lRemain
'输出'
For i = 0 To Count - 1
Debug.Print IIf(i > 0, "+", vbNullString) & (a(i) + lBase);
Next
Debug.Print "=" & Total
End Sub
'主要思路: 分4种情况, 1.份数为偶数, 相除后没有余数; 2.份数为偶数, 相除后有余数;
' 3.份数为奇数, 相除后没有余数; 4.份数为奇数, 相除后有余数;
Dim iInput As Long '输入的整数
Dim iCount As Long '份数(即除数)
'以上2个变量相当于传入的参数
Dim iInt As Long '相除后的取整结果(也可以说是平均数)
Dim iAvg As Long '平均数
Dim iMod As Long '余数 Dim i As Long
Dim iAdd As Long
Dim iRes() As Long
iInput = Val(Text1.Text)
iCount = Val(Text2.Text)
iInt = Int(iInput / iCount)
iMod = iInput Mod iCount
iAdd = 1
'分4种情况
ReDim iRes(1 To iCount) As Long
Select Case iCount Mod 2
Case 0 '份数是偶数
If iMod = 0 Then '没有余数,即可以被整除 (1)
For i = 1 To iCount / 2
iRes(i) = iInt + iAdd
iRes(iCount - i + 1) = iInt - iAdd
iAdd = iAdd + 1
Next
Else '有余数 (2)
For i = 1 To iCount / 2
If iAdd = iMod + 1 Then iAdd = iAdd + 1 '关键点: 考虑余数的作用下产生重复数
iRes(i) = iInt + iAdd + IIf(i = 1, iMod, 0)
iRes(iCount - i + 1) = iInt - iAdd
iAdd = iAdd + 1
Next
End If
Case Else '份数是奇数
If iMod = 0 Then '没有余数,即可以被整除 (3)
iRes(Int(iCount / 2) + 1) = iInt
For i = 1 To Int(iCount / 2)
iRes(i) = iInt + iAdd
iRes(iCount - i + 1) = iInt - iAdd
iAdd = iAdd + 1
Next
Else '有余数 (4)
iRes(Int(iCount / 2) + 1) = iInt + iMod
For i = 1 To Int(iCount / 2)
If iAdd = iMod Then iAdd = iAdd + 1 '关键点: 考虑余数的作用下产生重复数
iRes(i) = iInt + iAdd
iRes(iCount - i + 1) = iInt - iAdd
iAdd = iAdd + 1
Next
End If
End Select
iMod = 0
Debug.Print String(10, "=") & " Begin = " & Str(iInput) & " / " & Str(iCount)
For i = 1 To iCount
iMod = iMod + iRes(i)
Debug.Print Trim(Str(iRes(i)))
Next
Debug.Print "合计: " & Trim(Str(iMod))
Debug.Print String(10, "=") & " End = " & Str(iInput) & " / " & Str(iCount)
lBase = (Total - lSum) \ Count
'将余数部分调整到随机数中'
lRemain = Total - lSum - lBase * Count
这部分lRemain 不是恒等于0吗~~
1 * lngY / Abs(lngY)这部分恒等于1~~