注册 登录
编程论坛 VB6论坛

请教前辈们如何将一个整数A拆分为N个数,拆分后的N个数之和等于A,且拆分的数在c-d之间

bettergod 发布于 2018-08-09 21:01, 2008 次点击
请教前辈们如何将一个整数A拆分为N个数,拆分后的N个数之和等于A,且拆分的数在c-d之间

比如要将一个数1000,拆分为10个数,拆分后的数要在70-150之间

3 回复
#2
bettergod2018-08-10 20:14
#3
wds12018-08-12 20:00
常规穷举算法,基本不可能,计算量为80^10。
下面给出的是重复拆分的一组简单拆分算法【拆分方法有多种,只是给出一种包含重复的拆分】
例如:
1000拆分为10组,70-150的,下面程序拆分为10个100
1000拆分为9组,70-150的,下面程序拆分为8个112,1个104
如果想要拆分为不重复数字和,只要完成N个数字前n/2 +1,+2...;后n/2 -1,-2处理。

Private Sub Command1_Click()
  m = Val(Text1.Text) '1000
  n = Val(Text2.Text) '10
  m1 = Val(Text3.Text) '70
  m2 = Val(Text4.Text) '150
  ReDim a(1 To n)
  If (m - n * m2 > 0) or ( m - n * m1 < 0 ) Then
    MsgBox ("不能拆分")
  Else
    tmp = Abs(m - n * m2)
    temp0 = tmp Mod n
    temp1 = Int(tmp / n)
    For i = 1 To n
      a(i) = m2 - temp1
    Next i
    a(n) = a(n) - temp0
  End If
  For i = 1 To n
    Debug.Print i, a(i)
  Next i
End Sub

[此贴子已经被作者于2018-8-15 15:05编辑过]

#4
wds12018-08-14 16:27
Private Sub Command2_Click() '不重复拆分
  m = Val(Text1.Text) '1000
  n = Val(Text2.Text) '10
  m1 = Val(Text3.Text) '70
  m2 = Val(Text4.Text) '150
 
  sum1 = 0
  For i = 0 To n - 1: sum1 = sum1 + m1 + i: Next
  If sum1 > m Then MsgBox ("最小的连续n个数大于总数,不能拆分"): GoTo end1
  sum1 = 0
  For i = 0 To n - 1: sum1 = sum1 + m2 - i: Next
  If sum1 < m Then MsgBox ("最大的连续n个数小于总数,不能拆分"): GoTo end1
  If (m2 - m1) < n Then MsgBox ("全部区间的数量下雨拆分数,不能拆分"): GoTo end1
 
  ReDim a(n)
  avg1 = Int(m / n)'平均数
  avg2 = m Mod n '余数
  If n Mod 2 = 0 Then '偶数个拆分
    For i = 1 To n / 2: a(n / 2 - i + 1) = avg1 - i: Next '按从小到大赋值前n/2
    For i = 1 To n / 2: a(i + n / 2) = avg1 + i: Next '按从小到大赋值后n/2
  Else '奇数个拆分
    For i = 1 To Int(n / 2): a(Int(n / 2) - i + 1) = avg1 - i: Next
    For i = 1 To Int(n / 2): a(i + Int(n / 2) + 1) = avg1 + i: Next
    a(Int(n / 2) + 1) = avg1
  End If
  For i = n To (n - avg2 + 1) Step -1: a(i) = a(i) + 1: Next i '剩余数据从高到低补充
  For i = 1 To n
    Debug.Print i, a(i)
  Next
end1:
End Sub
1