Function ZDGYS(ByVal x As Long, ByVal y As Long) As Long 'GET Greatest Common Divisor最大公约数
Dim TEMP As Long If x > y Then TEMP = x: x = y: y = TEMP 'LET X < Y Do TEMP = y Mod x If TEMP = 0 Then ZDGYS = x: Exit Function y = x x = TEMP Loop End Function Sub CALC(ByVal N As Long, ByVal K As Long, Optional ByRef CNK As String) '计算C(N,K),赋值给CNK Dim XYS() As Integer, x() As Integer, y() As Integer, result() As String, i As Long, j As Long, T As Long, TEMP As Long, stimer As Double If N < 0 Or N < K Then Exit Sub stimer = Timer If K = N Or K = 1 Then CNK = N: GoTo R '特殊情况 If N > 0 And K = 0 Then CNK = 1: GoTo R '特殊情况 If K > N - K Then K = N - K '减少计算量 Dim NN() As Long, NK() As Long ReDim NN(1 To K) ReDim NK(1 To K) For i = 1 To K NN(i) = N + 1 - i ' N*(N-1)*(N-2)*....*(N+1-K) NK(i) = i ' 1*2*3*...*K Next
For i = K To 1 Step -1 For j = 1 To K TEMP = ZDGYS(NK(j), NN(i)) '最大公约数 If TEMP > 1 Then '消除分子分母 NN(i) = NN(i) / TEMP NK(j) = NK(j) / TEMP End If Next Next
TEMP = Len(CStr(NN(T))) ReDim y(1 To TEMP) For i = 1 To TEMP y(i) = Val(Mid(NN(T), TEMP + 1 - i, 1)) Next ReDim XYS(1 To UBound(x) + UBound(y)) For i = 1 To UBound(x) For j = 1 To UBound(y) XYS(i + j - 1) = XYS(i + j - 1) + x(i) * y(j) '模拟乘法运算 Next Next For i = 1 To UBound(x) + UBound(y) - 1 '进位 TEMP = XYS(i) \ 10 XYS(i) = XYS(i) Mod 10 XYS(i + 1) = XYS(i + 1) + TEMP Next T = T + 1 x = XYS If x(UBound(x)) = 0 Then ReDim Preserve x(1 To UBound(x) - 1) '第一位为零则去掉之