#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空間的代碼。
這個算法只是窮舉所有任意位數的密碼,當然這個算法還能繼續優化……