求排列组合算法

arryang 2012-08-02 06:53:18
排列:
char obj[] = {0,1,2,3,4,5,6,7,8};

obj 中包含九个字符,请打印出从这个九个字符中任意取出n个数的结果,即P(m,n)排列

在网上搜集很久,只找到了全排列的算法实现,但这种通用的排列的算法实现没找到,哪位高人愿意共享一下自己的算法实现?或给指定一个现成的排列组合算法实现库?
非常感谢,感觉这算法很普通的,为什么就没有人实现呢?
只有30分了,全部奉上!
...全文
110 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
smsgreenlife 2012-08-03
  • 打赏
  • 举报
回复
又换了一种算法,感觉比上面的好理解一些,效率也提高了,你看看能理解吗。

#include <stdio.h>
#include <stdlib.h>

void pnm2(int n, char src[], int m, int pos)
{
if(m==0)
{
int i;
for(i=-1*pos; i<0; ++i)
{
printf("%c", src[i]);
}
printf("\n");
return;
}
else
{
int i;
for(i=0; i<n; ++i)
{
int temp = src[0];
src[0] = src[i];
src[i] = temp;
pnm2(n-1, &src[1], m-1, pos);
temp = src[0];
src[0] = src[i];
src[i] = temp;
}
}
}

void main()
{
int n = 3;

char obj[4] = {'0','1','2','3'};

pnm2(4, obj, n, n);
}
smsgreenlife 2012-08-02
  • 打赏
  • 举报
回复
当n=3时,共有9*8*7种排列方式,控制台不能全部显示,当n=2是可以全部显示。
smsgreenlife 2012-08-02
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

void pnm(int n, char src[], int m, char des[], int pos)
{
if(m==0)
{
while(--pos>=0)
{
printf("%c", des[pos]);
}
printf("\n");
return;
}
else
{
int i;
char *new_src = (char*)malloc((n-1)*sizeof(char));
for(i=0; i<n; ++i)
{
des[pos] = src[i];
int j;
for(j=0; j<i; ++j)
{
new_src[j] = src[j];
}
while(j<n-1)
{
new_src[j] = src[j+1];
++j;
}
pnm(n-1, new_src, m-1, des, pos+1);
}
}
}

void main()
{
int n = 2;

char obj[9] = {'0','1','2','3','4','5','6','7','8'};
char *des = (char*)malloc(n*sizeof(char));
pnm(9, obj, n, des, 0);
}
cao_julians 2012-08-02
  • 打赏
  • 举报
回复
n位m进制整数,从0到m^n-1顺序枚举,(再分解为n个一位数),筛选出没有重复数字的即解
muyi66 2012-08-02
  • 打赏
  • 举报
回复
这样简单的东西,一小会儿不就写出来了?如果这个都写不出来,那你得问问自己这些年都干啥去了。

69,382

社区成员

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

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