从5种不同颜色的球中取三个球,要求这三个球每个颜色都不一样,问:有多少种取法?用C语言或伪代码实现.

关键是要排除排列的影响,
如果直接用三个for循环来处理的话,会出现red,black,white和white,black,red是两种取法这一现象(其实只属于一种).
请C高手帮帮忙(尤其是算法工程师)!

这个问题可以用二进制位来表示

5个二进制位代表五种颜色的球
要找的组合就是三个位是1两个位是0的那部分

#include <stdio.h>

int main(void)
{
int i;
int count;
int n = 0;
for (i = 7; i <= 28; i++)
{
count = 0;
if ((i & 1) == 1)
count++;
if ((i & 2) == 2)
count++;
if ((i & 4) == 4)
count++;
if ((i & 8) == 8)
count++;
if ((i & 16) == 16)
count++;

if (count == 3)
{
printf("%d\n", i);
n++;
}

}
printf("\n%d", n);

}

7 二进制 是 111
28 二进制 是 11100
因为是5取三 所以循环从7 到 28

结果是 10 种
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-25
#include <stdio.h>
void main()
{
enum color{red,yellow,blue,while,blace};
enum color i,j,k,pri;
int n,loop;
n=0;
for(i=red;i<=black;i++)
for(j=red;j<=blace;j++)
if(i!=j) //这句是关键!
{
for(k=red;k<=blace;k++)
if((k!=i)&&(k!=j)) //这句亦是关键!
{
n=n+1; //用于表示共有多少种组合!
printf("%-4d",n);
for(loop=1;loop<=3;loop++)
{
switch(loop)
{
case 1 :pri=i;break;
case 2 :pri=j;break;
case 3 :pri=k;break;
default break;
}
switch(pri)
{
case red: printf("%-10s","red");break;
case yellow: printf("%-10s","yellow");break;
case blue: printf("%-10s","blue");break;
case white:printf("%-10s","white");break;
case black:printf("%-10s","blace");break;
default :break;
}
}
printf("\n");
}
}
printf("\ntotal:%5d\n",n); //共有60种组合!
}
第2个回答  2009-05-25
1楼正解
2楼的算排列了,不对
3楼的做法对,看似效率高,其实不然
仔细分析,3楼的公式的复杂度和1楼一样,但1楼用的是耗时最少的运算:位运算,而3楼则要做乘法;并且做阶层的结果很可能太大,导致一般数据类型无法存放
第3个回答  2009-05-25
就是5个球里取出3个来,有几种方法。
5!/(3!*2!),写个阶乘的程序算一下就行。
第4个回答  2009-05-25
二楼的答案有重复的,算法不对

从5种不同颜色的球中取三个球,要求这三个球每个颜色都不一样,问:有...
结果是 10 种

从5个数中选3个有多少种不同选法?
从5个互不相同的非零数字中取出3个排列组成一个三位数,经过以上三步就全部完成了。根据分步乘法计数原理,样的三位数有:5×4×3=60种。排列的计算方式:排列有两种定义,但计算方法只有一种,凡是符合这两种定义的都用这种方法计算。1、定义的前提条件是m≤n,m与n均为自然数。2、从n个不同元...

...3人不在同一行也不在同一列,不同的选法有多少种?
关于C(5,3)C(5,3),应这样理解理解:5个行标中任意取3个(如例子中的1,3,5),5个列标中也任意取3个,这样9个元素只能位于3个列中,例子中的列标是不正确的取法,因为5个列中的元素都取了。比如列可取1,2,3(当然也可以是1,2,4等),那必定是规范的方阵。你的例子不符合要求:虽...

...现从中取5张,要求字母不同且三种颜色齐全的取法
颜色不同有两种情况: 其中3张牌颜色一样,或者其中有两对牌颜色一样 所以取法为(10)*3*2*1+(10)*(3)*3*2*1 = 180

...只同样大小的球,编号为1,2,3,4,5.从袋中同时取出3只球,以X表示取出...
3中任取2个,共有C32=3种取法,{X=5}表示取出的3个数以5为最大值,其余两个数从1,2,3,4中任取2个,共有C42=6种取法,故,P{X=5}也可由1-P{X=3}-P{X=4}得到 因此X的分布律为 X 3 4 5 pk frac{1}{10} frac{3}{10} frac{6}{10} ...

问一个数学概率问题
第一次随便拿到一个球概率1\/3,假设是红球,第二次不拿红球概率2\/3,第三次随便一种都可以,所以三只球颜色不全相同的概率是2\/9。

每种颜色的球至少取一个,有多少
对于①2白1红1蓝,它们进行排列,其排法有:P\/P=12种。因为两个白球是一样的,所以要除以P。所以,总共不同的排列方式有3*12=36种。从6个相同的白球,5个相同的红球,4个相同的蓝球里取4个球,每种颜色的球至少取一个来进行排列,有多少种取法?每种球至少取一个,那么就有:①2白1红1蓝...

排列组合问题
1、首先从第一个盒子里取出一个球,有n种可能颜色,而后面的就与前面是一们的颜色,既后面三个盒子的取法都只有一种,其概率为 n*1*1*1\/(n*n*n*n)=1\/n^3;2、首先选择三个盒子取颜色一样的球,有C 4 3种即4种方式,第一个盒子有n种可能颜色,后两个都与它一样,才一种,而与它们...

排列组合部分是中学教学中的难点之一,为什么这么说?
第三类:A在第三垄,B有一种选择, 同理A、B位置互换 ,共12种。 例4.从6双不同颜色的手套中任取4只,其中恰好有一双同色的取法有___。 (A)240 (B)180 (C)120 (D)60 分析:显然本题应分步解决。 (一)从6双中选出一双同色的手套,有种方法; (二)从剩下的十只手套中任选一只,有种方法...

高中数学排列组合。。求解!
在黑红白中先选一个颜色,C31,再在剩下两个颜色中选一个C21,就是C31C21,也可以写为A33,有A33=6种 3,按2:2:0取 在黑红白中只要选出不取球的那个颜色就行,剩下的两个颜色都去俩球,三个颜色中选1个,就是C31=3种 4,按2:1:1取 也是只要选出取两个球的那个颜色,剩下两个...

相似回答