博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

组合算法

Posted on 2009-04-29 09:16  linFen  阅读(641)  评论(1编辑  收藏  举报
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;
}