更新时间2019-09-26 01:56:59
这个问题,或是类似、相似的问题,就自己而言,已经看到过不下20多个了;
这里先给出一个解决方法,然后再作一些讨论;
假设在A列,从第r=2行开始,连续的单元格给出要判别的数字,比如n=6个数;
在C列给"和"的结果t:
先在VBA的"模块"页面编译好以下代码:
Function re(r, n, t)
Dim nu(15), nv(15)
Dim i As Long
m = 0
For i = 1 To n
x = Cells(r - 1 + i, 1)
If Round(x, 8) <= Round(t, 8) Then
m = m + 1
nu(m) = x
End If
Next i
For i = 1 To m ^ m
s = 0
re = ""
For j = 1 To m
nv(j) = 0
Next j
For j = 1 To 1 + Int((i - 1) / m ^ (m - 1))
nv(j) = ((Int((i - 1) / m ^ (j - 1))) Mod m) + 1
For k = 1 To j - 1
If nv(k) = nv(j) Then GoTo 10
Next k
Next j
For j = 1 To m
If nv(j) > 0 Then
s = s + nu(nv(j))
re = re & Format(nu(nv(j)), "0.000") & "+"
End If
Next j
If Abs(s - t) < 0.00000001 Then
re = Format(t, "0.000") & "=" & Left(re, Len(re) - 1)
Exit Function
End If
10 Next i
re = "未能匹配得到!"
End Function
该函数有3个输入参数,分别对应上述的r,n,t
所以,在E2单元格输入公式:
=re(2,6,$C2)
这样即可判别出"和"t是由A列中的哪几个数字加总而来的;
见附图:
但是,但是,但是,这是一个非常"鸡肋"的方法:
1 由于要对任意数据进行判别,只能采用"穷举"法,没有更为"智能"、"睿智"的方法;
2 "穷举"是一种很"无奈"、很"鸡肋"的方法,它牵涉到n^n的可能性,比如n=3,3^3=27种;还有题述给出的n=12,12^12=8,916,100,448,256【约9万亿】种;当然,排除了一些重复,实际会少一点,但数量级是不会减少的;
3 由于实际的算法只是找到第1种可能的"加总情形"即可,所以最终的计算组合会视乎总个数n及加总可能涉及到的最后一个数值的前后有关;
计算中,尝试了n=10,加总涉及的最后是的第6个数的情形,以VBA这种效率低下的"解析程序"语言及不高的手提电脑硬件配置,花费50分钟才能得出"穷举"结果;
4 当然,如果用C++,或汇编语言,上大型或超级计算机,肯定能提高效率;
5 还有一个限制,就是编程语言中的整形数的表达范围,用长整型也仅能到10亿的数级,像题述n=12,9万亿的量级还是无法实现;
当然,可以用编程方法使之能处理"任意"量级的整数,但还是要以时间为代价,也即会增加总体话费的时间;
可能无法解决n太大【即便是题述n=12的情形】的问题,但希望对问题的理解有所帮助。
下拉,自动求和,根据最后一位“.3”可以依次排除。
excel中有自动求和呀