#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空间的代码。

这个算法只是穷举所有任意位数的密码,当然这个算法还能继续优化……