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;
    }
  • 相关阅读:
    随时查询
    插入图片后R文件变红,报错“Error::app:mergeDebugResources'. > Some file crunching failed, see logs for detail”
    android 布局
    用SVN导入android项目时候没有导入default.properties这文件的解决方法
    Button的点击事件可以在XML文件中设置
    设置全屏有两种方式
    android 中加入的音乐文件有的时候没有播放。
    android spinner 调用xml里的数据
    刚刚申请了个博客发发感想
    .Net下WinForm换肤控件整理(转)
  • 原文地址:https://www.cnblogs.com/luluping/p/1445863.html
Copyright © 2011-2022 走看看