我认为这个题目就是一个计数问题,解决这类问题最基本的方法就是枚举了,如果没有限制条件,那么就可以用组合的方法计算,循环迭代或者递归,其实就是枚举,写出程序不难关键在于找到优化的方法,下面的代码是递归程序,只有一些优化,没有找到更好的优化方法 6 数相加和值100 模 3 用时 0.24秒 和 200 用时 3.1 秒 和 300 用时 15.5 秒
Public Function nums1ModK(ByVal sum As Long, ByVal number As Long, ByVal ModK As Long)
Dim n As Long
Dim r As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim str As String
If sum < number Then
nums1ModK = 0
Exit Function
End If
If number = 2 Then
nums1ModK = sum - 1
n = (sum - 1) \ ModK '需要过滤的个数
r = sum Mod ModK
If r = 0 Then 'sum能被整除
nums1ModK = nums1ModK - n '当sum能被整除时,两个变量必定同被整除或同式不被整除,那么两个同被整除变量要剪掉两个解的个数
Else
nums1ModK = nums1ModK - n * 2
End If
Exit Function
End If
Dim s As Long
nums1ModK = 0
For s = 1 To sum - (number - 1)
If (s Mod ModK) <> 0 Then
nums1ModK = nums1ModK + nums1ModK(sum - s, number - 1, ModK)
End If
Next
End Function
Public Function nums1ModK(ByVal sum As Long, ByVal number As Long, ByVal ModK As Long)
Dim n As Long
Dim r As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim str As String
If sum < number Then
nums1ModK = 0
Exit Function
End If
If number = 2 Then
nums1ModK = sum - 1
n = (sum - 1) \ ModK '需要过滤的个数
r = sum Mod ModK
If r = 0 Then 'sum能被整除
nums1ModK = nums1ModK - n '当sum能被整除时,两个变量必定同被整除或同式不被整除,那么两个同被整除变量要剪掉两个解的个数
Else
nums1ModK = nums1ModK - n * 2
End If
Exit Function
End If
Dim s As Long
nums1ModK = 0
For s = 1 To sum - (number - 1)
If (s Mod ModK) <> 0 Then
nums1ModK = nums1ModK + nums1ModK(sum - s, number - 1, ModK)
End If
Next
End Function