'型如 x1+x2+x3+x4+x5+x6=N 解的个数
'设定 变量个数 number 和值 sum 过滤整除数 modK 变量能否取0
'最简单的形式 modk=1
'可取0的情况 公式为 C(sum+number-1,sum)= C(sum+number-1,number-1)
'当number=2时 sum + 1
'以下是递归代码
Public Function nums0(ByVal sum As Long, ByVal number As Long) As Long
If number = 2 Then
nums0 = sum + 1
Exit Function
End If
Dim s As Long
nums0 = 0
For s = 0 To sum
nums0 = nums0 + nums0(sum - s, number - 1)
Next
End Function
'最简单的形式 modk=1
'不可取0的情况 公式为 C(sum-1,number-1) C(sum-1,sum-number)
'当number=2时 sum - 1
'以下是递归代码
Public Function nums1(ByVal sum As Long, ByVal number As Long) As Long
If number = 2 Then
nums1 = sum - 1
Exit Function
End If
Dim s As Long
nums1 = 0
For s = 1 To sum - 1
nums1 = nums1 + nums1(sum - s, number - 1)
Next
End Function
' 有过滤条件,写出组合公式很困难,但还有其他的数学模型,以后再说
'在函数nums1基础上添加过滤条件,写出代码还是可以的
'
Public Function nums1ModK(ByVal sum As Long, ByVal number As Long, ByVal ModK As Long)
Dim k As Long
Dim r As Long
If number = 2 Then
nums1ModK = sum - 1
k = (sum - 1) \ ModK '需要过滤的个数
r = sum Mod ModK
If r = 0 Then 'sum能被整除
nums1ModK = nums1ModK - k '当sum能被整除时,两个变量必定同被整除或同式不被整除,那么两个同被整除变量要剪掉两个解的个数
Else
nums1ModK = nums1ModK - k * 2
End If
Exit Function
End If
Dim s As Long
nums1ModK = 0
For s = 1 To sum - 1
If (s Mod ModK) <> 0 Then nums1ModK = nums1ModK + nums1ModK(sum - s, number - 1, ModK)
Next
End Function
'当sum增大时,解的个数迅速增加,sum<500时解的个数没超过long范围,如果要计算更大的值,就要增加大数处理了