组合与排列的生成:先考虑正整数m和n,1<=n<=m<1000,输出从m个数中取出n个所有组合,例如输入5,3,则应输出可以构成的所有组合123,231,125,234,235,345。然后修改为排列生成程序,输入正整数m,1<m<1000,输出m个全排列。不应该是简单地用多重循环枚举所有可能情况的程序。
现在我一点头绪都没有,是用循环嵌套来做?还是什么。。很迷茫啊,求详细过程。。。
#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个才对。可是,我显示出来的是很吓人的一堆数字。。
追答你自己引入一个变量,加一个限制条件限制输出的全排列个数吧
递归的话。。用在组合生成上会不会很麻烦?
追答递归就是解决类似这种问题的。
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位的值设为没取过,进入下一次循环,测试下一种可能性
用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个,这个时候把直线以大正方体的一个顶点为转动点,把直线沿着对角线小范围内转动,这时,直线穿过的小...
找一本书,紧急求助!高分悬赏!还会另加高分的!
这九部小说分别是《大森林里的小木屋》《草原上的小木屋》《农庄男孩》《在梅溪边》《在银湖岸》《好长的冬天》《草原小镇》《快乐的金色年代》和《新婚四年》。罗兰的小说出版后就很受欢迎,到她八十七岁时,这套“小木屋”系列小说开始译成多国语言,在世界各地发行。一九五七年,罗兰在密苏里州的落矶山农场...