关于数值运算的问题

gmlwx 2005-09-16 09:12:50
有一数值,知道它是由一批数值中的某几个数组成,如何写一程序求出这几个数呢?
例:
数值为:
10414.36

数组为:
1134.56
239.26
3598.92
408.27
5272.61
263.28
1111.56
226.53
141
1355.89
3.45
2149.9
10
218.38
150

现在手工计算得:10414.36=1134.56+3598.92+408.27+5272.61

请问,如何用程序实现呢?
给点思路也行!!!
...全文
177 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yas 2005-09-16
  • 打赏
  • 举报
回复
这样是不是太慢了点?

为什么不先按大小排序

逐一相减,若余数小于剩余最小的一个数,那么就退出比较,该组合不成立
jxgzay 2005-09-16
  • 打赏
  • 举报
回复
勘误:
数组 x(1),x(2),...x(n)分成m个1组,可以归结到将下标1,2,3,...n,m个1组,打印所有分组情况。


jxgzay 2005-09-16
  • 打赏
  • 举报
回复
数组 x(1),x(2),...x(n)分成m组可以归结到将下标1,2,3,...n分m组
jxgzay 2005-09-16
  • 打赏
  • 举报
回复
有空写一段完整代码给你。
思路:
(已知:)
数值 a
数组 x(1),x(2),...x(n)

(关键,可做成函数:)
将n个数分成m组 ,穷举所有分组。
然后对每组求和,如和为a,打印(或显示)这组数据。
(循环调用函数)
对m从1 到n循环,求出一切可能分组,计算一切可能的求和,如和等于a,打印这组数据。
gmlwx 2005-09-16
  • 打赏
  • 举报
回复
to: yas(新一代的矿工)
给点儿提示啦!
yangjiaxin_1 2005-09-16
  • 打赏
  • 举报
回复
呵呵 错了。
是回去试试!
yas 2005-09-16
  • 打赏
  • 举报
回复
我已经有一个方法了,只是描述起来比较烦

提示一下,先对数组排序
yangjiaxin_1 2005-09-16
  • 打赏
  • 举报
回复
maik 回车试试
faysky2 2005-09-16
  • 打赏
  • 举报
回复
最笨的方法: 将数组进行排列组合 然后分别把各个组合相加后与你的数值比较,相等的话就记下组合
不过如果数组元素很多的话 运算量会很大!!!
conrad_wan 2005-09-16
  • 打赏
  • 举报
回复
穷举?
gmlwx 2005-09-16
  • 打赏
  • 举报
回复
TO:Fanks(铁面人)
这个就是要用程序实现的原因。
Fanks 2005-09-16
  • 打赏
  • 举报
回复
得出的结果可能不止一组啊。
gmlwx 2005-09-16
  • 打赏
  • 举报
回复
强!!!马上结贴!!!
yas 2005-09-16
  • 打赏
  • 举报
回复
不得不佩服LS
northwolves 2005-09-16
  • 打赏
  • 举报
回复
如果改为:

Private Sub Command1_Click()
Dim x, S() As String
x = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
GETALL 25, x, S '和为25 时
End Sub


返回值:

1+2+4+5+6+7=25
3+4+5+6+7=25
1+2+3+5+6+8=25
2+4+5+6+8=25
1+2+3+4+7+8=25
2+3+5+7+8=25
1+4+5+7+8=25
1+3+6+7+8=25
4+6+7+8=25
northwolves 2005-09-16
  • 打赏
  • 举报
回复

Sub GETALL(ByVal SUM As Single, ByVal x As Variant, ByRef RESULT() As String)
Dim A(), I As Long, NUM As Integer, ALLNUM As Long, n As Integer
Dim TEMP1 As Long, TEMP2() As Integer, TEMP As Single
n = UBound(x)
ReDim TEMP2(0 To n - 1)
ALLNUM = 0
For I = 1 To 2 ^ n
TEMP1 = I
NUM = 0
TEMP = 0
For j = 0 To n - 1 '转换为二进制
TEMP2(j) = TEMP1 And 1 '0 or 1
TEMP1 = TEMP1 \ 2
If TEMP2(j) = 1 Then
NUM = NUM + 1
ReDim Preserve A(1 To NUM)
A(NUM) = x(j)
TEMP = TEMP + x(j)
End If
Next

If Abs(TEMP - SUM) < 0.01 Then '满足条件

ALLNUM = ALLNUM + 1
ReDim Preserve RESULT(1 To ALLNUM)

RESULT(ALLNUM) = Join(A, "+") & "=" & SUM '结果保存
End If
Next
MsgBox Join(RESULT, vbCrLf), 4096, ALLNUM & " 种方法"

End Sub

Private Sub Command1_Click()
Dim x, S() As String
x = Array(1134.56, 239.26, 3598.92, 408.27, 5272.61, 263.28, 1111.56, 226.53, 141, 1355.89, 3.45, 2149.9, 10, 218.38, 150)

GETALL 10414.36, x, S '和为10414.36 时
End Sub
samwzhang 2005-09-16
  • 打赏
  • 举报
回复
如果只是加法,还能穷举,如果有加减乘除,那恐怕 。。。 。。。
晕忽忽的,这种求绝对结果的问题不是计算机所擅长的。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧