耐人寻味的算法问题。

myvicy 2006-11-08 04:19:17
找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为:
(1)1、2、3 (2)1、2、4 (3)1、2、5
(4)1、3、4 (5)1、3、5 (6)1、4、5
(7)2、3、4 (8)2、3、5 (9)2、4、5
(10)3、4、5
排列中不要出现如 123 132 321这种3个数完全相同的组合。
写个小程序,n和r可以自定,并且列出来的所有组合可以打印出来,或是可以导出文本文件

我考虑是用循环加递归实现。
谁能给出详细的代码?
...全文
500 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
栗小游 2006-11-10
  • 打赏
  • 举报
回复
就是排列组合呗,呵呵,原来在大学的时候和宿舍的同学一起玩过,想出了很多很多方法,都挺有意思的……
malligator 2006-11-10
  • 打赏
  • 举报
回复
怎么样最后也得定下来的呀
不是有动态分配么??

http://community.csdn.net/Expert/topic/5143/5143758.xml?temp=4.392642E-02
挺拔的劲松 2006-11-10
  • 打赏
  • 举报
回复
找出自然数1,2,3……,n中任取r个数的所有组合。
#include<stdio.h>
#define MAXN 100
int a[MAXN];
void comb(int m, int k)
{
int i,j;
for(i=m;i>=k;i--)
{
a[k]=i;
if(k>1) comb(i-1,k-1);
else
{
for (j=a[0];j>0;j--) printf("%4d",a[j]);
printf("\n");
}
}
}

void main()
{
a[0]=3;
comb(5,3);
}
myvicy 2006-11-10
  • 打赏
  • 举报
回复
楼上的,如果n和r的大小不确定也能两层循环搞定吗?
我是搜索不到,才来问的。
crazy_lazy_pig 2006-11-10
  • 打赏
  • 举报
回复
n久以前 n 多人讨论过了, 有详悉的算法说明, 和原代码, 楼主就不会自己搜一搜?
不用递归, 两层循环足够了.
唐巧 2006-11-08
  • 打赏
  • 举报
回复
来晚了。。。
zhousqy 2006-11-08
  • 打赏
  • 举报
回复
哪里有算法,哪里就有pcboyxhy(-273.15℃)
  • 打赏
  • 举报
回复
标记一下,明天来做
myvicy 2006-11-08
  • 打赏
  • 举报
回复
pcboyxhy(-273.15℃)
n没有限制的。
cy2005abc 2006-11-08
  • 打赏
  • 举报
回复
看错了,sorry
cy2005abc 2006-11-08
  • 打赏
  • 举报
回复
for(ii=p[n-1]; ii<len; ++ii)改为 for(ii=p[n-1]; ii<=len; ++ii)

pcboyxhy 2006-11-08
  • 打赏
  • 举报
回复
#include <stdio.h>

char used[20]={0};
int len, i, m, p[20];

void output()
{
printf("\n");
for(i=0; i<m; ++i)
printf("%d ", p[i]+1);
}

int pailie(int n)
{
int ii;
if(n==m)
output( );

for(ii=p[n-1]; ii<len; ++ii)
if(!used[ii])
{
used[ii] = 1;
p[n] = ii;
pailie(n+1);
used[ii] = 0;
}
return 0;
}

int main( )
{
int index = 0;
scanf("%d", &len);
scanf("%d", &m);
pailie(0);
}

不知道你要的是不是这个
xdspower 2006-11-08
  • 打赏
  • 举报
回复
自己写吧,这个应该不难的,主要还需要考虑n和r的值是否可以有有效组合,即n>=r

69,373

社区成员

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

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