| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1878 人关注过本帖
标题:请教前辈们如何将一个整数A拆分为N个数,拆分后的N个数之和等于A,且拆分的 ...
只看楼主 加入收藏
bettergod
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-8-9
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
请教前辈们如何将一个整数A拆分为N个数,拆分后的N个数之和等于A,且拆分的数在c-d之间
请教前辈们如何将一个整数A拆分为N个数,拆分后的N个数之和等于A,且拆分的数在c-d之间

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

搜索更多相关主题的帖子: 整数 拆分 个数 之和 等于 
2018-08-09 21:01
bettergod
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-8-9
收藏
得分:0 
2018-08-10 20:14
wds1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:49
帖 子:393
专家分:2025
注 册:2016-3-10
收藏
得分:20 
常规穷举算法,基本不可能,计算量为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编辑过]

2018-08-12 20:00
wds1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:49
帖 子:393
专家分:2025
注 册:2016-3-10
收藏
得分:0 
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
2018-08-14 16:27
快速回复:请教前辈们如何将一个整数A拆分为N个数,拆分后的N个数之和等于A,且拆 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031087 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved