M個元素集合取出N個不重複排列組合

#include<stdio.h>
#include<string.h>

int check(char *str, int l)
{
     for(int i=0; i<l ;i++)
     {
          for(int j=0; j<l ;j++)
          {
               if(j==i)
                continue;
               if(str[i]==str[j])
                return 1;
        
          }
     }
 return 0;
}

void Show(int n,int m,char *str, char *p,double *i)
{
     n--;
    
     for(int a=0; a < m; a++)
     {
          p[n] = str[a];
          if(n==0){
               if( !check( p, strlen(p)) ){
                    (*i)++;
                    printf("%s ",p);
               }
          }
          if(n>0) Show( n, m, str, p, i);
     }
}

/*測試*/
int main(void)
{
     char set[] = "0123456789"; //元素集合 密碼允許0-9
     int M= strlen(set);//集合中有M個元素 密碼6位
     int N = 6;  //從集合取出N個元素
     char p[20];  //存放排列組合,用於輸出。
     double num = 0; //存放統計不同排列組合個數的數值.
     p[n] = '\0';
    
      
     Show( N, M,set,&num);
     printf("\n%d個元素的集合取出%d個元素,並且每位置的字符都不與其他位置重複的話,共有:%f個組合。\n",M,N,num);
    
     return 0;
}

這個是12年3月發表在QQ空間的代碼。

這個算法只是窮舉所有任意位數的密碼,當然這個算法還能繼續優化……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章