用C语言编程组合与排列的生成,很着急。。高分悬赏。下周要交。悬赏可以再加~~~跪求高手

组合与排列的生成:先考虑正整数m和n,1<=n<=m<1000,输出从m个数中取出n个所有组合,例如输入5,3,则应输出可以构成的所有组合123,231,125,234,235,345。然后修改为排列生成程序,输入正整数m,1<m<1000,输出m个全排列。不应该是简单地用多重循环枚举所有可能情况的程序。
现在我一点头绪都没有,是用循环嵌套来做?还是什么。。很迷茫啊,求详细过程。。。

#include <stdio.h>
int m,n,k;
int array[1001];
int flag[1001];
void combination(int now,int lenght);
void arrange();
int main()
{
scanf("%d %d", &m, &n);
combination(1, 0);
k = 0;
arrange(0);
printf("总共有%d种排列方式\n", k);
return 0;
}
void combination(int now, int lenght)
{
int i;
if (lenght == n)
{
for (i = 0;i < n;i++)
{
printf("%d", array[i]);
}
printf("\n");
return ;
}
for (;now <= m - n + lenght + 1;now++)

{
array[lenght] = now;
combination(now + 1, lenght + 1);
}
}
void arrange(int lenght)
{
int i;
if (lenght == n)
{
for (i = 0;i < n;i++)
{
printf("%d", array[i]);
}
printf("\n");
k++;
return;
}
for (i = 1;i <= m;i++)
{
if (!flag[i])
{
array[lenght] = i;
flag[i] = 1;
arrange(lenght + 1);
flag[i] = 0;
}
}
}
你想要应该是这样的吧,上面老兄好像弄错了哈追问

#include
int m,n,k;
int array[1001];
int flag[1001];
void combination(int now,int lenght);
void arrange();
int main()
{
scanf("%d %d", &m, &n);
combination(1, 0);
k = 0;
arrange(0)===>这里运行的时候出现错误了,为什么呢

追答

#include
int m,n,k;
int array[1001];
int flag[1001];
void combination(int now,int lenght);
void arrange(int lenght);
int main()
{
scanf("%d %d", &m, &n);
combination(1, 0);
k = 0;
arrange(0);
printf("总共有%d种排列方式\n", k);
return 0;
}
void combination(int now, int lenght)
{
int i;
if (lenght == n)
{
for (i = 0;i < n;i++)
{
printf("%d", array[i]);
}
printf("\n");
return ;
}
for (;now <= m - n + lenght + 1;now++)

{
array[lenght] = now;
combination(now + 1, lenght + 1);
}
}
void arrange(int lenght)
{
int i;
if (lenght == n)
{
for (i = 0;i < n;i++)
{
printf("%d", array[i]);
}
printf("\n");
k++;
return;
}
for (i = 1;i <= m;i++)
{
if (!flag[i])
{
array[lenght] = i;
flag[i] = 1;
arrange(lenght + 1);
flag[i] = 0;
}
}
}
改好了,也就是忘了,最上面的
void combination(int now,int lenght);
void arrange();
中给void arrange();中定义一个类型,即把void arrange();改成void arrange(int lenght)就可以了
看看现在可以了吧~

追问

上面的组合个数是显示出来了,那之后怎么修改为排列生成程序,输入正整数m,1<m<1000,输出m个全排列呢。。而且,如果说M是50的话,那么全排列应该为50个才对。可是,我显示出来的是很吓人的一堆数字。。

追答

你自己引入一个变量,加一个限制条件限制输出的全排列个数吧

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-08
具体做法我忘记了,应该是用递归来做的追问

递归的话。。用在组合生成上会不会很麻烦?

追答

递归就是解决类似这种问题的。

第2个回答  2011-04-08
好久没用C语言写东西了,有点不习惯。
#include <stdio.h>
int m,n,k;
int array[1001];//用来保存输出结果的,
int flag[1001];//全排列用来标识该位的数字是否已经用过了,0:没有,1:有。

void combination(int now,int lenght);//组合
void arrange();//全排列

int main()
{
//scanf("%d %d",&m,&n);
m=5;
n=3;
//combination(1,0);
k=0;
arrange(0);
printf("总共有%d种排列方式\n",k);
return 0;
}

void combination(int now,int lenght)
{
int i;
if(lenght == n)
{
for(i=0;i<n;i++)
{
printf("%d ",array[i]);
}
printf("\n");
return ;
}
for(;now<=m-n+lenght+1;now++)
{
array[lenght]=now;
combination(now+1,lenght+1);
}
}

void arrange(int lenght)
{
int i;
if(lenght == m)
{
for(i=0;i<m;i++)
{
printf("%d ",array[i]);
}
printf("\n");
k++;
return;
}
for(i=1;i<=m;i++)
{
if(!flag[i])
{
array[lenght]=i;
flag[i]=1;
arrange(lenght+1);
flag[i]=0;
}
}
}追问

if(!flag[i])
{
array[lenght]=i;
flag[i]=1;
arrange(lenght+1);
flag[i]=0
这里是什么意思,是排列吗?

追答

采用了回溯法,这样枚举出种可能性。
array[lenght]=i;//假设这一层的值是i
flag[i]=1;//就把i位的值设为已经取过了
arrange(lenght+1);//进入下一层,直到输出结果
flag[i]=0;//还是在原来那一层,把i位的值设为没取过,进入下一次循环,测试下一种可能性

第3个回答  2011-04-09
/***********************************************************/
#define LCD XBYTE[0xffff] // 定义LCD显示的数组,这边用0xffff浪费
// 只要32就可以了
#define uint unsigned int // 宏定义“短表示”,方便书写
#define uchar unsigned char // 同上

void lcd_mwc(uchar i) // 这个函数是用来写命令的:如启动液晶
// 锁定液晶等,可以查看液晶控制字就知道
// 0xb8和0x40是什么命令了,估计是启动
/*********************************************/
// 属于函数void lcd_clear(void) 要查看液晶的规格书
uchar i; // 定义液晶每页的地址个数,用来清0
uchar page; // 定义液晶的Page地址(page=0xb8;page<0xc0;page++) // 循环清零
/*********************************************/
uchar i; // 定义传送数据的个数
for (i=16;i<32;i++) lcd_mwd(*(hz+i)); // lcd_mwd函数的作用是通过给LCD
// 数组初始化地址,然后根据地址
// 递增将数组QING[32]等的对应地
// 数据传送到液晶数据口;这边是
// 循环传送后面16个数据

for (i=0;i<16;i++) lcd_mwd(*(hz+i)); // 同上,传送前面的16个数据
/*****************************************************************/
从你的程序上看,液晶应该由上下两块显示Page组成,然后上面的Page显示4个汉字的上半段,下面显示4个汉字的下半段,所以有8个Page,和你的void lcd_clear(void) 函数也就对应了。

void dispm_hz_down(uchar code * hz)

用C语言编程组合与排列的生成,很着急。。高分悬赏。下周要交。悬赏可以...
include <stdio.h> int m,n,k;int array[1001];int flag[1001];void combination(int now,int lenght);void arrange();int main(){ scanf("%d %d", &m, &n);combination(1, 0);k = 0;arrange(0);printf("总共有%d种排列方式\\n", k);return 0;} void combination(int now, int...

C语言编写一个程序,急用!!高分悬赏(正确答案追加分数)
if(input != result)printf("真可惜, 回答错误, 请再接再厉!\\n");else printf("恭喜你, 回答正确, 请继续加油!\\n");plu[i][0] = m;plu[i][1] = n;plu[i][2] = input;plu[i][3] = result;} printf("===十道题目回答如下===\\n\\n");for(int j = 0; j < 10; j+...

图中找回路 C语言编程 跪求大神帮助 高分悬赏 采纳 追加分数
(1)可以用矩阵表示图 (2)用深入优先(DFS)从任 一顶点v0开始搜索,在搜索过程中标记访问过的顶点和边,如果有某个顶点未访问,且该顶点有一条边与v0相连,即找到一条回路。伪码差不多是这个样子吧。int DFS(Graph G,int vj){ visited[vj]=TRUE;for(vj所有邻接点vi){ if(visited[vi]=FAL...

高分悬赏!!!用C语言编一程序。将大写26个字母,小写26个字母,0到9十个...
for(int j=0;j<8;j++)printf("%c",a[j]);printf("\\n");x++;} }

高分悬赏,用C语言实现:获取汉字的首字母。
如果想知道一个汉字的首字母,而且不用汉字拼音对照,只有一种办法,就是根据汉字的GB2312编码规则找到规律,然后对比汉字编码属于哪个字母段,我以前写过一个Minigui的检索,就这样搞的 ,分类表见参考资料 参考资料:http:\/\/hi.baidu.com\/yunlongchn\/blog\/item\/f6e16ffbd4ea961b6d22ebc8.html ...

c语言0到任意数的连加,求和 高分悬赏
C语言求100以内的奇数和,偶数和13 C语言编程实现计算1到100之间的奇数之和32 更多相关问题>> 用APP一键提问“c语言0...”的问题 回答 include <stdio.h> main(){ int sum1(0),sum2(0);for(int i = 0 ; i < 101 ; i++){ if(i%2 == 0)sum1++;else sum2++;} printf("%d ...

高分悬赏创意搞笑的年会奖项名称,回答的好悬赏可以再加!!
1.轻搞笑推荐用五楼的日新月异,如果要重搞笑,改进一下叫:日新月异之朝三暮四 奖。2.步惊云 or 步惊云之云云众生 奖 (不用芸芸,而用云云,步是谐部的音而意为步伐,云均代表部门,也可直接以谐音字面理解。楼主自己体会韵意吧)3.往桶钻员(网通专员) or 网捅(通) or 旺了众...

世界难题!高分悬赏破译密码第二关!
那个EST好象我在其他哪个语言中经常看见过,单从英文看读音又有点像EAST,不知道字源上有没有联系。(或者是表示最高级?)FORTUNAE好熟悉,是什么?fortunate?fortune?或者是FORTRAN语言(笑)……再说一句,问主啊,我帮你编程统计词频等一些概率 那听起来还不错 不过涉及到些希奇古怪的语言文字...

高分悬赏一道排列组合题
考虑当n=1情况 答案S(以下都是一个意思)=1 当n=2时 S=4 (这个应该不难想象,挺简单的,首先直线穿过最多小正方体的情况肯定在对角线附近,想象的时候先把直线想象成对角线,这个时候穿过2个,这个时候把直线以大正方体的一个顶点为转动点,把直线沿着对角线小范围内转动,这时,直线穿过的小...

找一本书,紧急求助!高分悬赏!还会另加高分的!
这九部小说分别是《大森林里的小木屋》《草原上的小木屋》《农庄男孩》《在梅溪边》《在银湖岸》《好长的冬天》《草原小镇》《快乐的金色年代》和《新婚四年》。罗兰的小说出版后就很受欢迎,到她八十七岁时,这套“小木屋”系列小说开始译成多国语言,在世界各地发行。一九五七年,罗兰在密苏里州的落矶山农场...

相似回答
大家正在搜