#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空间的代码。
这个算法只是穷举所有任意位数的密码,当然这个算法还能继续优化……