一个整数(随意输入),分成1-30任意份(随意输入份数)。每份必须也是整数,之间差距在一定范围内。所有份数的和是输入的那个整数。
比如 输入的整数是100,输入的份数是5份,每份之间差距是10.
那得到的是  18,17,25,27,13 就符合要求。

解决方案 »

  1.   


    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
      

  2.   

    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
        
        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
      

  3.   

    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
        
        '根据随机数的和、目标和求出所有数追加的基数'
        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.   

        '该代码已经测试过,准确无误:
        '主要思路: 分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)
      

  5.   

    老鸟中的代码
     lBase = (Total - lSum) \ Count
        
        '将余数部分调整到随机数中'
        lRemain = Total - lSum - lBase * Count
    这部分lRemain 不是恒等于0吗~~
      

  6.   

    jone99的代码
    1 * lngY / Abs(lngY)这部分恒等于1~~