zoukankan      html  css  js  c++  java
  • 组合算法

    unsigned char number[100];  // 最多求100个数的组合。 
    unsigned int m, n;           // 2 <=m <=100,n <m 

    char tmpbuf[128]; 
    time_t ltime; 
    struct tm *today; 

    void printtime(void)    // 打印当前时间的函数 

        time(&ltime); 
        today = localtime(&ltime); 
        strftime(tmpbuf, 128, "%Y-%m-%d %H:%M:%S", today); 
        printf("%s\n", tmpbuf); 
    }

    void inition() // 初始化 
    {
        unsigned int i;
         
        for (i = 0; i < n; i++) 
            number[i] = 1


    void output() // 输出组合结果 

        unsigned int i;
         
        for (i = 0; i < m; i++) 
            if(number[i])
                printf("%02d ", i+1);
                 
        printf("\n"); 


    int main() 

        unsigned long count;    // 计数组合个数 
        unsigned int i, j, k, l; 
        bool findfirst, end, swap; 
        end = false;
         
        printf("please input m:"); 
        scanf("%d",&m);
        printf("please input n:"); 
        scanf("%d",&n);
        printtime();    // 打印开始时间 
        inition();      // 初始化    
        output();       // 输出结果
        count = 1
        j = m;
        
        while (!end) 
        { 
            findfirst = false;        
            swap = false;       // 标志复位 
           
            for ( i = 0; i < j; i++) 
            { 
                if (!findfirst && number[i]) 
                { 
                    k = i;            // k记录下扫描到的第一个数 
                    findfirst = true; // 设置标志 
                }
                 
                if (number[i] && !number[i+1]) //从左到右扫描第一个“10”组合 
                { 
                    number[i] = 0
                    number[i+1] = 1
                    swap = true;            //设置交换标志 
                   
                    for (l = 0; l < i - k; l++) 
                        number[l] = number[k+l]; 
                    for (l = i-k; l < i; l++) 
                        number[l] = 0;            //交换后将之前的“1”全部移动到最左端
                         
                    if (k == i && i+1 == m-n)   //如果第一个“1”已经移动到了m-n的位置,说明这是最后一个组合了。 
                        end = true; 
                }
                 
                if(swap) //交换一次后就不用继续找“10”组合了 
                    break
            }
             
            output(); //屏蔽掉结果输出以节约时间 
            count++; //组合数计数器递增1 
        }
       
        printtime(); //打印结束时间    
        printf("total number of combination is: %d\n",count); //打印总的组合数   
        getchar(); 
        getchar();
        return 1;
    }
  • 相关阅读:
    劳动手册补办
    敏捷开发之“燃尽图之谜”
    JIra配置权限方案
    Scrum的三个仪式:Sprint规划会,Scrum每日站会,Sprint评审会
    Jira更改工作流后,敏捷看板里无法显示sprint对应的问题列表
    JIRA使用过程出现问题整理解答
    2020系统综合实践 第8次实践作业
    2020系统综合实践 第7次实践作业
    2020系统综合实践 第6次实践作业
    2020系统综合实践 第5次实践作业
  • 原文地址:https://www.cnblogs.com/luluping/p/1445863.html
Copyright © 2011-2022 走看看