C语言问题,鞋子就是10双鞋其中每2双鞋是一种,随机抽出4只鞋,至少能...
发布网友
发布时间:2024-10-17 19:16
我来回答
共1个回答
热心网友
时间:2024-10-31 23:51
组合数学忘光了,想不起来公式了。用穷举法算:统计至少配成一双的取法数,然后除以总取法数。
#include <stdio.h>
int isPair(int i, int j, int k, int l);
int isPair(int a, int b);
int main() {
int SHOES_COUNT = 20; // 鞋子数
int i, j, k, l; // 取哪四只鞋
long total = 0; // 总取法数
long c = 0; // 至少能配成一双的取法数
// 鞋子编号 0,1,2,...,19
// 0,1,2,3为第1种鞋,4,5,6,7为第2种鞋,...,16,17,18,19为第5种鞋
// 偶数编号0,2,...,18为左脚,奇数编号1,3,...,19为右脚
// 如果4只鞋中有任意2只是同一种鞋并且分别为左右脚,则至少能配成一双
for (i = 0; i < SHOES_COUNT; i++) {
for (j = 0; j < SHOES_COUNT; j++) {
for (k = 0; k < SHOES_COUNT; k++) {
for (l = 0; l < SHOES_COUNT; l++) {
if (i != j && i != k && i != l && j != k && j != l && k != l) {
total++;
if (isPair(i, j, k, l)) {
c++;
}
}
}
}
}
}
printf("至少能配成一双的概率:%f\n", (double) c / total);
return 0;
}
int isPair(int i, int j, int k, int l) {
return isPair(i, j) || isPair(i, k) || isPair(i, l) || isPair(j, k)
|| isPair(j, l) || isPair(k, l);
}
int isPair(int a, int b) {
return (a / 4 == b / 4) && (a % 2 != b % 2) ? 1 : 0;
}