精华内容
下载资源
问答
  • C语言编写排列组合代码#include #include #define MAX 6char example[]="0123456789abcdefghijklmnopqrstuvwxyz";int length=36;char a[MAX+1],b[MAX+1];FILE *fp;void ADD(char a[],int m);int main(){if((fp=fopen...

    C语言编写排列组合代码

    #include

    #include

    #define MAX 6

    char example[]="0123456789abcdefghijklmnopqrstuvwxyz";

    int length=36;

    char a[MAX+1],b[MAX+1];

    FILE *fp;

    void ADD(char a[],int m);

    int main()

    {

    if((fp=fopen("a.txt","r"))==NULL)

    {

    printf("the file is bad\n");

    exit(0);

    }

    fscanf(fp,"%s",b);

    int i,j,k;

    for(i=0;i

    {

    a[i]='0';

    }

    a[MAX]=0;

    while(1)

    {

    ADD(a,MAX); printf("%s\n",a);

    if(strcmp(a,b)==0)

    {

    system("cls");

    printf("THE CODE IS %s\n",a);

    break;

    }

    }

    return 0;

    }

    void ADD(char *a,int m)

    {

    int i=m-1,j;

    for(j=0;j

    展开全文
  • (1) 全排列:全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。例如:{1, 2, 3}的全排列为:123;132;213;231;312;321;共6个,即3!=321=6。这个是怎么算...

    首先看递归实现,由于递归将问题逐级分解,因此相对比较容易理解,但是需要消耗大量的栈空间,如果线程栈空间不够,那么就运行不下去了,而且函数调用开销也比较大。

    (1) 全排列:

    全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。

    例如:{1, 2, 3}的全排列为:

    123;132;

    213;231;

    312;321;

    共6个,即3!=321=6。

    这个是怎么算出来的呢?

    首先取一个元素,例如取出了1,那么就还剩下{2, 3}。

    然后再从剩下的集合中取出一个元素,例如取出2,那么还剩下{3}。

    以此类推,把所有可能的情况取一遍,就是全排列了,如图:

    116287456_1_20171115103748480.png

    知道了这个过程,算法也就写出来了:

    将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。

    perm(set,s,e){顺序从s~e中选出一个元素与s交换(即选出一个元素)调用perm(set,s+1,e)直到s>e,即剩余集合已经为空了,输出set}

    c语言代码如下:

    voidperm(intlist[],ints,inte,void(*cbk)(intlist[])){inti;if(s>e){(*cbk)(list);}else{for(i=s;i<=e;i++){swap(list,s,i);perm(list,s+1,e,cbk);swap(list,s,i);}}}

    其中:

    voidswap(int*o,inti,intj){inttmp=o[i];o[i]=o[j];o[j]=tmp;}voidcbk_print(int*subs){printf("{");for(inti=0;i

    (2)组合:

    组合指从n个不同元素中取出m个元素来合成的一个组,这个组内元素没有顺序。使用C(n, k)表示从n个元素中取出k个元素的取法数。

    C(n, k) = n! / (k! * (n-k)!)

    例如:从{1,2,3,4}中取出2个元素的组合为:

    12;13;14;23;24;34

    方法是:先从集合中取出一个元素,例如取出1,则剩下{2,3,4}

    然后从剩下的集合中取出一个元素,例如取出2

    这时12就构成了一个组,如图。

    116287456_2_20171115103748714.png

    从上面这个过程可以看出,每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。

    comb(set,subset,n,k){反向从集合中选出一个元素,将这个元素放入subset中。调用comb(set,subset,n-1,k-1)直到只需要选一个元素为止}

    C语言代码如下:

    voidcombine(ints[],intn,intk,void(*cbk)(int*subset,intk)){if(k==0){cbk(subset,k);return;}for(inti=n;i>=k;i--){subset[k-1]=s[i-1];if(k>1){combine(s,i-1,k-1,cbk);}else{cbk(subset,subset_length);}}}

    任何递归算法都可以转换为非递归算法,只要使用一个栈模拟函数调用过程中对参数的保存就行了,当然,这样的方法没有多少意思,在这里就不讲了。下面要说的是用其它思路实现的非递归算法:

    (1)全排列:

    首先来看一段代码:

    #include#includeusingnamespacestd;intmain(){intmyints[]={1,2,3};cout<

    这段代码是从STL Permutation上考下来的,要注意的是第10行,首先对数组进行了排序。

    第14行的next_permutation()是STL的函数,它的原理是这样的:生成当前列表的下一个相邻的字典序列表,里面的元素只能交换位置,数值不能改变。

    什么意思呢?

    123的下一个字典序是132,因为132比123大,但是又比其他的序列小。

    算法是:

    (1) 从右向左,找出第一个比右边数字小的数字A。

    (2) 从右向左,找出第一个比A大的数字B。

    (3) 交换A和B。

    (4) 将A后面的串(不包括A)反转。

    就完成了。

    好,现在按照上面的思路,写出next_permutation函数:

    templateboolnext_perm(T*start,T*end){//_asm{int 3}if(start==end){returnfalse;}else{T*pA=NULL,*pB;T tmp=*end;// find A.for(T*p=end;p>=start;p--){if(*p=start;p--){if(*p>*pA){pB=p;break;}}// swap A, B.tmp=*pA;*pA=*pB;*pB=tmp;// flip sequence after Afor(T*p=pA+1,*q=end;p

    (2)组合:01交换法

    使用0或1表示集合中的元素是否出现在选出的集合中,因此一个0/1列表即可表示选出哪些元素。

    例如:[1 2 3 4 5],选出的元素是[1 2 3]那么列表就是[1 1 1 0 0]。

    算法是这样的:

    comb(set,n,k){(1)从左到右扫描0/1列表,如果遇到“10”组合,就将它转换为”01”.(2)将上一步找出的“10”组合前面的所有1全部移到set的最左侧。(3)重复(1)(2)直到没有“10”组合出现。}

    代码如下:

    templatevoidcombine(Tset[],intn,intk,void(*cbk)(Tset[])){unsignedchar*vec=newunsignedchar[n];T*subset=newT[k];// build the 0-1 vector.for(inti=0;i

    至于其中的道理,n个位置上有k个1,按照算法移动,可以保证k个1的位置不重复,且覆盖n一遍。

    展开全文
  • 排列组合 C语言实现

    千次阅读 2016-06-04 23:15:11
    #include #include <stdlib.h>int array[] = {1,2,3,4};#define N 4 #define M 3 int queue[N] = {0}; //保存已经找到的结果,前缀 int top = 0;... //是否已经排列过了的标志/** * 排列 * @param s 递归
    #include <stdio.h>
    #include <stdlib.h>
    
    int array[] = {1,2,3,4};
    
    #define N  4
    #define M  3
    int results[N] = {0}; //保存已经找到的结果前缀数组
    int results_end = 0; //结果前缀数组有效数据下标
    int is_used[N] = {0}; //是否已经排列过了的标志
    
    /**
     * 排列
     * @param deep 递归深度
     * @param n 数组最大长度
     */
    void perm(int deep, int n)
    {
        int i;
        if (deep > n) // 越界递归结束
        {
            return;
        }
    
        if (deep == n) // 找到结果,打印,递归结束
        {
            for (i = 0; i < n; i++)
            {
                printf("%d", results[i]);
            }
            printf("\t");
            return ;
        }
    
        for (i = 0; i < n; i++)
        {
            if (is_used[i] == 0)
            {
                is_used[i] = 1;
                results[deep] = array[i];
                perm(deep+1, n);
                is_used[i] = 0;
            }
        }
    }
    
    /**
     * 组合
     * @param deep 递归深度
     * @param n 数组最大长度
     * @param m 要查找的组合的长度
     */
    void comb(int deep, int n, int m)
    {
        int i = 0;
        if (deep > n) // 越界递归结束
            return ;
        if (results_end == m) // 找到结果,打印,递归结束
        {
            for (i = 0; i < m; i++)
            {
                printf("%d", results[i]);
            }
            printf("\t");
            return ;
        }
        results[results_end++] = array[deep];
        comb(deep+1, n, m); //向下一级递归
        results_end--;
        comb(deep+1, n, m); //向下一级递归
    }
    
    int main()
    {
        int i = 0;
        printf("全排列:\n");
        perm(0, N);
        printf("\n1~%d的所有组合:\n", N);
        for(i=1; i<=N; i++){
            comb(0, N, i);
        }
        printf("\n");
        return 0;
    }

    运行结果
    [root@centos6 data]# gcc test.c
    [root@centos6 data]# ./a.out
    全排列:
    1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
    1~4的所有组合:
    1 2 3 4 12 13 14 23 24 34 123 124 134 234 1234


    始于2010-12-30,Tencent;更新至2016-06-02,杭州。

    展开全文
  • c语言程序输出所有不重复八卦排列组合.txt
  • } /* * 文件名:Combination.c * 用途:组合算法 * 编程环境:WinXP SP2+CL 8.0 * 完成日期: 2006.2 Ver 0.01 * 作者: 88250 * 联系方式: E-mail: DL88250@gmail.com QQ:845765 */ #include #...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    /*

    *  文件名:Permutation.c

    *  用途:全排列算法

    *  编程环境:WinXP SP2+CL 8.0

    *  完成日期: 2006.2   Ver 0.01

    *  作者: 88250

    *  联系方式: E-mail: DL88250@gmail.com  QQ:845765

    */

    #include 

    #include 

    int count = 0;

    void permutation(char per[], int m, int len)

    {

    int i;

    char tmp;

    if (m 

    permutation(per, m + 1, len);

    for (i = m + 1; i 

    /* 选当次的排列“头” */

    tmp = per[m];

    per[m] = per[i];

    per[i] = tmp;

    permutation(per, m + 1, len);

    /* 恢复上一次的排列 */

    tmp = per[m];

    per[m] = per[i];

    per[i] = tmp;

    }

    }else{

    ++count;        /* 对排列进行计数 */

    /* 调整一下格式^^ */

    printf("%s ", per);

    }

    return;

    }

    int main(void)

    {

    int i = time(NULL);

    char per[] = "ABCD";

    permutation(per, 0, strlen(per));

    printf("The total: %d" , count);

    return 0;

    }

    /*

    *  文件名:Combination.c

    *  用途:组合算法

    *  编程环境:WinXP SP2+CL 8.0

    *  完成日期: 2006.2   Ver 0.01

    *  作者: 88250

    *  联系方式: E-mail: DL88250@gmail.com  QQ:845765

    */

    #include 

    #define MAX_NUM 20

    int comb[MAX_NUM];

    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", comb[j] + 64);

    }

    printf(" ");

    }

    }

    return;

    }

    int main(int argc, char *argv[])

    {

    comb[0] = 2;

    combination(4, comb[0]);        /* C(4, 2) */

    return 0;

    }

    展开全文
  • c语言实现的排列组合程序

    热门讨论 2009-06-25 21:05:28
    用递归实现排列组合,并能够结合解决P(m,n)问题
  • c语言排列组合

    2012-03-05 23:48:54
    小小wintc程序 计算排列组合代吗 用递归写的 呵呵
  • 排列组合C语言实现

    2021-02-09 18:53:07
    排列组合排列 数学定义 Amn\quad A_m^nAmn​表示在m个数中取出n个数,并进行全排列,当m=n时,为全排列,可写为n!n!n!。 Amn=m(m−1)(m−2)....(m−n)A_m^n=m(m-1)(m-2)....(m-n)Amn​=m(m−1)(m−2)....(m−n...
  • 排列组合算法是考查递归的常见算法,这两种算法能用递归简洁地实现。本人在经过多次摸索和思考之后,总结如下,以供参考。程序代码如下:#include #include char array[] = "abcd";#define N 4#define M 3int ...
  • 程序排列组合算法的c语言表示,使用递归实现
  • C语言 排列组合问题

    2021-04-22 17:01:41
    计算阶乘、组合数与排列数,并进行测试。 其中排列Pmn=m!/(m-n)!,组合Cmn=m!/(n!*(m-n)!)   #include "stdio.h" int fact(int n); //阶乘函数 int cmn(int m,int n); //组合函数 ...
  • C语言程序设计大赛资料一:知识点数据结构:1,单,双链表及循环链表2,树的表示与存储,二叉树(概念,遍历)二叉树的应用(二叉排序树,判定树,博弈树,解答树等)3,文件操作(从文本文件中读入数据并输出到文本文件...
  • C语言排列组合

    2014-07-03 13:47:54
    1.排列:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列
  • Problem Description  Bob has N balls and A boxes. He numbers the balls from 0 to N-1, and numbers the boxes from 0 to A-1. To find the balls easily, he puts the ball numbered x into the box numbered...
  • 主要介绍了C语言实现的排列组合问题的通用算法、解决方法,本文使用C语言实现在程序中解决这个问题,需要的朋友可以参考下
  • C语言实现排列组合

    千次阅读 2018-03-26 19:04:52
    //是否已经排列过了的标志 /** * 排列 * @param deep 递归深度 * @param n 数组最大长度 */ void perm(int deep, int n) { int i; if (deep > n) // 越界递归结束 { return; } if (deep == n) // 找到...
  • C语言程序设计构造数据类型《C语言程序设计》-第八章 7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 用typedef定义类型 7.1结构体 7.1.1 结构体类型定义 7.1.2 结构体变量的使用 7.1.3 结构体数组 7.1.2 结构体变量 间接...
  • c语言实现排列组合

    千次阅读 2018-02-22 23:53:02
    组合数:C语言组合数不能直接使用数学公式C(n,m)=(m!)/(n!*(n-m)!);公式变形: (m!)/(n!*(m-n)!)=(m*(m-1)*(m-2)*…*(m-n+2)*(m-n+1))/(n!)=((m-n+1)/1)*((m-n+2)/2)*((m-n+3)/3)*…*((m-n+n)/n)=∏((m-n+k)/k...
  • 例:用户输入:a,b,c输出: a,b,c,ab,ac,bc,abc解:此程序应不仅适用于3个字符的情况~运用递归即可解决:法1:#include#include#define MAX 100int top = 0;//缓冲区指针。int count = 1;//统计组合数。void search...
  • 想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧。...
  • 排列组合是我们高中时期就学过的知识,还记得当初被甲乙丙丁们站在一排的数学问题所折磨,苦不堪言奥。那么,我们再来复习一下,什么是排列组合呢?排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素...
  • 名名的妈妈从外地出差回来,带了一盒...现在给定N,请你写程序求出名名吃巧克力的方案数目。 【输入形式】输入只有1行,即整数N。 【输出形式】输出只有1行,即名名吃巧克力的方案数。 【样例输入】4 【样例输出】5
  • 本文将编写一个函数实现数学排列的功能,采用的办法是递归。具体功能如图所示: 一、函数的讲解 1.1 函数的原型 函数的原型:int** Permutation(int* iarr,int size); 将数组的首地址和数组的大小传递进去,函数将...
  • c语言程序精品课程试题

    千次阅读 2019-08-05 14:15:40
    C语言程序设计》精品课件试题 目录 (按住CTRL键点击超链) 单项选择题………………………第002页 阅读程序题………………………第018页 程序填空题………………………第039页 编写程序题………………………第070...
  • Problem Description In the popular TV series Heroes, there is a tagline "Save the cheerleader, Save the world!". Here Heroes continues, "Solve the puzzle, Save the world!". Finally, alien invaders ...
  • Problem Description You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or leave the ‘1’ there. Surly, you may get many different results....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,428
精华内容 6,171
关键字:

排列组合c语言程序

c语言 订阅