怎么编程实现排列组合?

yeyu333 2014-05-19 12:58:25
例如
编程实现从5人里面随机选3个人出来。有多少种不同的选法?
该如何编写?
需要用到 头文件MATH.H吗,若不用到该怎么写?
谢谢!
...全文
1625 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
sadadi 2014-05-28
  • 打赏
  • 举报
回复
引用 33 楼 yeyu333 的回复:
[quote=引用 32 楼 sadadi 的回复:] [quote=引用 28 楼 sadadi 的回复:]

srand((unsigned int)time(NULL));
	int a[5]={3,67,9,2,5};
	int i=0,j=0,k=0;
	i=rand()%5;
	j=rand()%5;
	k=rand()%5;
	if(i==j)
	{
		i=abs(i-rand()%5);
	}
	if(j==k)
	{
		k=abs(k-rand()%5);
	}
	if(i==k)
	{
		while(j==i||k==i)
			i=rand()%5;
	}
	cout<<a[i]<<" "<<a[j]<<" "<<a[k];
失误。。。

srand((unsigned int)time(NULL));
    int a[5]={3,67,9,2,5};
    int i=0,j=0,k=0;
    while(i==k||i==j||j==k)
	{
		i=rand()%5;
		j=rand()%5;
		k=rand()%5;
	}
    
    cout<<a[i]<<" "<<a[j]<<" "<<a[k];
[/quote] 可是我现在不会用RAND()啊,这个是不是产生一个随机的数 还有time(null)是怎么回事啊?[/quote] time的定义: time_t time( time_t *timer ); 用法是你先自己定义一个time_t变量,让后把变量的地址传给它。函数会返回自1970年1月1日0点走过的秒数,同时把这个返回值保存在你传进来的那个time_t*指向的变量里面。如果你传进来NULL的话,就不保存。 srand()函数是用来重置随机数的种子。参数为一个unsigned int time()取当前时间。 整个语句就是将随机数的种子设为当前时间。经常会在随机数使用前用到,可以保证每次生成的随机数不一样。
longburulin 2014-05-27
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
凡是不超过10000行代码能实现的算法都称不上复杂。
赵老师啊 求交往 求联系啊 我要为你生孩子啊
正义飞 2014-05-27
  • 打赏
  • 举报
回复
量变很可能会引起质变。
sadadi 2014-05-27
  • 打赏
  • 举报
回复
引用 28 楼 sadadi 的回复:

srand((unsigned int)time(NULL));
	int a[5]={3,67,9,2,5};
	int i=0,j=0,k=0;
	i=rand()%5;
	j=rand()%5;
	k=rand()%5;
	if(i==j)
	{
		i=abs(i-rand()%5);
	}
	if(j==k)
	{
		k=abs(k-rand()%5);
	}
	if(i==k)
	{
		while(j==i||k==i)
			i=rand()%5;
	}
	cout<<a[i]<<" "<<a[j]<<" "<<a[k];
失误。。。

srand((unsigned int)time(NULL));
    int a[5]={3,67,9,2,5};
    int i=0,j=0,k=0;
    while(i==k||i==j||j==k)
	{
		i=rand()%5;
		j=rand()%5;
		k=rand()%5;
	}
    
    cout<<a[i]<<" "<<a[j]<<" "<<a[k];
一根烂笔头 2014-05-27
  • 打赏
  • 举报
回复
引用 29 楼 yeyu333 的回复:
[quote=引用 24 楼 my_live_123 的回复:] 如果简单来论的话,套用公式直接计算即可!C(5,3)
这是库内MATH.H里面的吗 那里面又发生饿了什么状况了呢?[/quote] 不是库,我写的是数学公式!查看排列组合相关知识
yeyu333 2014-05-27
  • 打赏
  • 举报
回复
引用 32 楼 sadadi 的回复:
[quote=引用 28 楼 sadadi 的回复:]

srand((unsigned int)time(NULL));
	int a[5]={3,67,9,2,5};
	int i=0,j=0,k=0;
	i=rand()%5;
	j=rand()%5;
	k=rand()%5;
	if(i==j)
	{
		i=abs(i-rand()%5);
	}
	if(j==k)
	{
		k=abs(k-rand()%5);
	}
	if(i==k)
	{
		while(j==i||k==i)
			i=rand()%5;
	}
	cout<<a[i]<<" "<<a[j]<<" "<<a[k];
失误。。。

srand((unsigned int)time(NULL));
    int a[5]={3,67,9,2,5};
    int i=0,j=0,k=0;
    while(i==k||i==j||j==k)
	{
		i=rand()%5;
		j=rand()%5;
		k=rand()%5;
	}
    
    cout<<a[i]<<" "<<a[j]<<" "<<a[k];
[/quote] 可是我现在不会用RAND()啊,这个是不是产生一个随机的数 还有time(null)是怎么回事啊?
sadadi 2014-05-26
  • 打赏
  • 举报
回复

srand((unsigned int)time(NULL));
	int a[5]={3,67,9,2,5};
	int i=0,j=0,k=0;
	i=rand()%5;
	j=rand()%5;
	k=rand()%5;
	if(i==j)
	{
		i=abs(i-rand()%5);
	}
	if(j==k)
	{
		k=abs(k-rand()%5);
	}
	if(i==k)
	{
		while(j==i||k==i)
			i=rand()%5;
	}
	cout<<a[i]<<" "<<a[j]<<" "<<a[k];
??Pao? 2014-05-26
  • 打赏
  • 举报
回复
引用 21 楼 yeyu333 的回复:
[quote=引用 20 楼 a1385341 的回复:] [quote=引用 7 楼 HiSoldier__ 的回复:] [quote=引用 5 楼 yeyu333 的回复:] [ [quote=引用 1 楼 HiSoldier__ 的回复:]

#include <stdio.h>

int main()
{
    int i, j, k;

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 5; j++) {
            if (j == i) continue;
            for (k = 1; k <= 5; k++) {
                if (k == i || k == j) continue;
                printf("i = %d, j = %d, k = %d\n", i, j, k); 
            }   
        }   
    }   
    return 0;
}
只要选3个就可以了,比如125和152是同一种类型[/quote] 那只要吧continue换成break就行了[/quote] 厉害,我看到 “只要选3个就可以了,比如125和152是同一种类型” 这句话的时候在想后面加个判断把数字相加比较就好了,知道看到你的回答。。[/quote] 他这样也不行,尽管换成了BREAK、其实一开始一开始我也想到了令其相加,但是想了下会有很多的代码而且好多的变量。其实到了这里发现又出现了新的问题[/quote] 不是C(5,3)吗? (5*4*3)/(3*2*1)=10 换成break结果

i = 3, j = 2, k = 1
i = 4, j = 2, k = 1
i = 4, j = 3, k = 1
i = 4, j = 3, k = 2
i = 5, j = 2, k = 1
i = 5, j = 3, k = 1
i = 5, j = 3, k = 2
i = 5, j = 4, k = 1
i = 5, j = 4, k = 2
i = 5, j = 4, k = 3
少了哪一个了吗?
yeyu333 2014-05-26
  • 打赏
  • 举报
回复
引用 24 楼 my_live_123 的回复:
如果简单来论的话,套用公式直接计算即可!C(5,3)
这是库内MATH.H里面的吗 那里面又发生饿了什么状况了呢?
赵4老师 2014-05-26
  • 打赏
  • 举报
回复
量变很可能会引起质变。
赵4老师 2014-05-26
  • 打赏
  • 举报
回复
引用 23 楼 my_live_123 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
引用 18 楼 zxh707wk 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
+1[/quote]
引用 9 楼 yeyu333 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
老师 收我为徒吧![/quote] 复杂不复杂,不是用代码来衡量的。计算各种复杂度,以及证明它的归属,比如是P,NP,还是NPC等等才是正解。算法和程序存在区别。算法是抽象,程序是实例,抽象的具体描述![/quote] 是的,我承认,一个Hello World代码和Windows操作系统的难度都是NP问题。
一根烂笔头 2014-05-26
  • 打赏
  • 举报
回复
如果简单来论的话,套用公式直接计算即可!C(5,3)
一根烂笔头 2014-05-26
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
凡是不超过10000行代码能实现的算法都称不上复杂。
引用 18 楼 zxh707wk 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
+1[/quote]
引用 9 楼 yeyu333 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
老师 收我为徒吧![/quote] 复杂不复杂,不是用代码来衡量的。计算各种复杂度,以及证明它的归属,比如是P,NP,还是NPC等等才是正解。算法和程序存在区别。算法是抽象,程序是实例,抽象的具体描述!
yeyu333 2014-05-25
  • 打赏
  • 举报
回复
引用 10 楼 yeyu333 的回复:
[quote=引用 7 楼 HiSoldier__ 的回复:] [quote=引用 5 楼 yeyu333 的回复:] [ [quote=引用 1 楼 HiSoldier__ 的回复:]

#include <stdio.h>

int main()
{
    int i, j, k;

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 5; j++) {
            if (j == i) continue;
            for (k = 1; k <= 5; k++) {
                if (k == i || k == j) continue;
                printf("i = %d, j = %d, k = %d\n", i, j, k); 
            }   
        }   
    }   
    return 0;
}
只要选3个就可以了,比如125和152是同一种类型[/quote] 那只要吧continue换成break就行了[/quote] 嗯 我试试啊 [/quote] 这样发现还是不行
yeyu333 2014-05-25
  • 打赏
  • 举报
回复
引用 20 楼 a1385341 的回复:
[quote=引用 7 楼 HiSoldier__ 的回复:] [quote=引用 5 楼 yeyu333 的回复:] [ [quote=引用 1 楼 HiSoldier__ 的回复:]

#include <stdio.h>

int main()
{
    int i, j, k;

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 5; j++) {
            if (j == i) continue;
            for (k = 1; k <= 5; k++) {
                if (k == i || k == j) continue;
                printf("i = %d, j = %d, k = %d\n", i, j, k); 
            }   
        }   
    }   
    return 0;
}
只要选3个就可以了,比如125和152是同一种类型[/quote] 那只要吧continue换成break就行了[/quote] 厉害,我看到 “只要选3个就可以了,比如125和152是同一种类型” 这句话的时候在想后面加个判断把数字相加比较就好了,知道看到你的回答。。[/quote] 他这样也不行,尽管换成了BREAK、其实一开始一开始我也想到了令其相加,但是想了下会有很多的代码而且好多的变量。其实到了这里发现又出现了新的问题
水手怕水 2014-05-24
  • 打赏
  • 举报
回复
引用 7 楼 HiSoldier__ 的回复:
[quote=引用 5 楼 yeyu333 的回复:] [ [quote=引用 1 楼 HiSoldier__ 的回复:]

#include <stdio.h>

int main()
{
    int i, j, k;

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 5; j++) {
            if (j == i) continue;
            for (k = 1; k <= 5; k++) {
                if (k == i || k == j) continue;
                printf("i = %d, j = %d, k = %d\n", i, j, k); 
            }   
        }   
    }   
    return 0;
}
只要选3个就可以了,比如125和152是同一种类型[/quote] 那只要吧continue换成break就行了[/quote] 厉害,我看到 “只要选3个就可以了,比如125和152是同一种类型” 这句话的时候在想后面加个判断把数字相加比较就好了,知道看到你的回答。。
cao_julians 2014-05-23
  • 打赏
  • 举报
回复
引用 18 楼 zxh707wk 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
+1[/quote] 单纯用数量(代码行数)衡量算法的复杂度有点太片面。
707wk 2014-05-22
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
凡是不超过10000行代码能实现的算法都称不上复杂。
+1
cao_julians 2014-05-21
  • 打赏
  • 举报
回复
引用 11 楼 yeyu333 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。
请问C语言里用#include <graphics.h> 为什么会报错,好像是库里没有这个。那怎么办啊? 我的 VISUAL C++6.0 32MB的[/quote] graphics.h是borland公司在TC2.0,BC3.0及后继版本中提供的一套图形函数,并不是ANSI C建议的标准函数,不具备可移植性。因此别的C编译系统中(如MS 的visual C++)并没有这一套函数-----如果有对应类似的函数,也不用这个头文件
流动的书签 2014-05-21
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
	int i, j, k;
	int num = 0;//排列的种数
	char people[] = { 'a','b','c','d','e'};
	for (i = 0; i < 3; i++)
	{
		for (j = i+1; j < 4; j++)
		{
			for (k = j+1; k < 5; k++)
			{
				printf("%c\t%c\t%c\n",people[i],people[j],people[k]);//输出排列
				num += 1;
			}
		}
	}
	printf("%d\n",num);
	return 0;
}               
加载更多回复(15)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧