在 n 个不同的小球中取出 m 个球,不放回,给出具体的取球方案并统计一共有多少种 的不同的取法。
#include <stdio.h>
#include <string.h>
void printBallSequence(char balls[], int m, int index, char sequence[], int count) {
if (count == m) {
for (int i = 0; i < m; i++) {
printf("%c ", sequence[i]);
}
printf("\n");
return;
}
for (int i = index; i < strlen(balls); i++) {
sequence[count] = balls[i];
printBallSequence(balls, m, i + 1, sequence, count + 1);
}
}
unsigned long long calculateCombinations(int n, int m) {
unsigned long long numerator = 1;
unsigned long long denominator = 1;
int diff = n - m;
if (diff < m) {
m = diff;
}
for (int i = 0; i < m; i++) {
numerator *= (n - i);
denominator *= (i + 1);
}
return numerator / denominator;
}
int main() {
char balls[26];
printf("请输入小球标志(最多26个): ");
scanf("%s", balls);
int n = strlen(balls);
int m;
printf("请输入需要取出的小球数量: ");
scanf("%d", &m);
printf("取球方案如下:\n");
char sequence[m];
printBallSequence(balls, m, 0, sequence, 0);
unsigned long long combinations = calculateCombinations(n, m);
printf("不同的取法共有 %llu 种\n", combinations);
return 0;
}