#console
Declare Function printf CDECL Lib"msvcrt" (fmt As *Byte, ...) As Long
/***********************************************************
combinat.c -- 組合せの数
***********************************************************/
Function comb(n As Long, k As Long) As Long
If k = 0 Or k = n Then
comb = 1
Exit Function
End If
/* if (k == 1) return n; */
comb = comb(n - 1, k - 1) + comb(n - 1, k)
End Function
Function combination(n As Long, k As Long) As DWord
Dim i As Long, j As Long
Dim a[17] As DWord
If n - k < k Then k = n - k
If k = 0 Then
combination = 1
Exit Function
End If
If k = 0 Then
combination = n
Exit Function
End If
If k > 17 Then
combination = 0 /* error */
Exit Function
End If
For i = 1 To k-1
a[i] = i + 2
Next
For i = 3 To n - k + 1
a[0] = i
For j = 1 To k
a[j] = a[j] + a[j - 1]
Next
Next
combination = a[k - 1]
End Function
Const N = 8
Dim n As Long, k As Long
printf(Ex"\n k")
For k = 0 To N
printf("%6d", k)
Next
printf(Ex"\nn ")
For k = 0 To N
printf("------")
Next
printf(Ex"\n")
For n = 0 To N
printf("%d |", n)
For k = 0 To n
printf("%6d", comb(n, k))
Next
printf(Ex"\n")
Next
printf(Ex"\n k")
For k = 0 To N
printf("%6d", k)
Next
printf(Ex"\nn ")
For k = 0 To N
printf("------")
Next
printf(Ex"\n")
For n = 0 To N
printf("%d |", n)
For k = 0 To n
printf("%6lu", combination(n, k))
Next
printf(Ex"\n")
Next
For k = 0 To 17
printf(Ex"34C%-2d = %10lu\n", k, combination(34, k))
Next