怎么编程实现排列组合?
例如
编程实现从5人里面随机选3个人出来。有多少种不同的选法?
该如何编写?
需要用到 头文件MATH.H吗,若不用到该怎么写?
谢谢!
------解决方案--------------------
#include
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;
}
------解决方案--------------------
#include
#include
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m,int n) {
int i,j;
for (i=m;i>=n;i--) {
comb[n]=i; /* 选择当前的“头”元素 */
if (n>1) {
combination(i-1,n-1); /* 进入下一次更小的组合问题 */
} else { /* 满了需要的组合数,输出 */
for (j=comb[0];j>0;j--) printf("%c",'A'+c1-comb[j]);
printf("\n");
}
}
return;
}
int main(int argc,char **argv) {
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 1;
}
c1=atoi(argv[1]);
if (c1<1
------解决方案--------------------
MAX_NUM
printf("1<=组合下标<=%d\n",MAX_NUM);
return 2;
}
c2=atoi(argv[2]);
if (c2<1
------解决方案--------------------
c1
printf("1<=组合上标<=组合下标\n");
return 3;
}
comb[0]=c2;
combination(c1,c2);
return 0;
}
------解决方案--------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
------解决方案--------------------
//qplw.cpp
#include
#include
#include
int v=0;
int w=0;
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
int s[256];
int i;
memset(s,0,sizeof(s));
memset(count,0,sizeof(count));
m=strlen(str);
if (w<1
------解决方案--------------------
m
while(*str) {
s[*str]++;
str++;
}
n=0;
for (i=0;i<256;i++)
if (s[i]) {
map[n]=i;
count[n]=s[i];
n++;
}
}
void Find(int depth) {//递归式回溯法生成全排列
if (depth==w) {
int i;
for (i=0;i