user-0 提问: 怎么编程实现排列组合？

回复:
user: user-1
content: 引用 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()取当前时间。 整个语句就是将随机数的种子设为当前时间。经常会在随机数使用前用到，可以保证每次生成的随机数不一样。

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:凡是不超过10000行代码能实现的算法都称不上复杂。赵老师啊 求交往 求联系啊  我要为你生孩子啊

user: user-3
content: 量变很可能会引起质变。

user: user-1
content: 引用 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];

user: user-4
content: 引用 29 楼 yeyu333 的回复:[quote=引用 24 楼 my_live_123 的回复:] 如果简单来论的话，套用公式直接计算即可！C（5，3）这是库内MATH.H里面的吗 那里面又发生饿了什么状况了呢？[/quote] 不是库，我写的是数学公式！查看排列组合相关知识

user: user-0
content: 引用 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)是怎么回事啊?

user: user-1
content: 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];

user: user-5
content: 引用 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  少了哪一个了吗？

user: user-0
content: 引用 24 楼 my_live_123 的回复:如果简单来论的话，套用公式直接计算即可！C（5，3）这是库内MATH.H里面的吗 那里面又发生饿了什么状况了呢？

user: user-6
content: 量变很可能会引起质变。

user: user-6
content: 引用 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问题。

user: user-4
content: 如果简单来论的话，套用公式直接计算即可！C（5，3）

user: user-4
content: 引用 8 楼 zhao4zhong1 的回复:凡是不超过10000行代码能实现的算法都称不上复杂。 引用 18 楼 zxh707wk 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。 +1[/quote]  引用 9 楼 yeyu333 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。 老师 收我为徒吧！[/quote]  复杂不复杂，不是用代码来衡量的。计算各种复杂度，以及证明它的归属，比如是P，NP，还是NPC等等才是正解。算法和程序存在区别。算法是抽象，程序是实例，抽象的具体描述！

user: user-0
content: 引用 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] 这样发现还是不行

user: user-0
content: 引用 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、其实一开始一开始我也想到了令其相加，但是想了下会有很多的代码而且好多的变量。其实到了这里发现又出现了新的问题

user: user-7
content: 引用 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是同一种类型”  这句话的时候在想后面加个判断把数字相加比较就好了，知道看到你的回答。。

user: user-8
content: 引用 18 楼 zxh707wk 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 凡是不超过10000行代码能实现的算法都称不上复杂。 +1[/quote] 单纯用数量（代码行数）衡量算法的复杂度有点太片面。

user: user-9
content: 引用 8 楼 zhao4zhong1 的回复:凡是不超过10000行代码能实现的算法都称不上复杂。 +1

user: user-8
content: 引用 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++)并没有这一套函数-----如果有对应类似的函数，也不用这个头文件

user: user-10
content: #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; }