- 介绍
- 递归生成字典函数
- 生日字典函数
- 主函数
- 运行样例展示
在密码长度固定时,用简单的多重循环很容易就实现密码字典的生成,但是当密码长度较长或者密码长度不固定时,这种多重循环很难完成我们的需求了,遇到这样的问题,应该就需要交给递归了,这篇文章所描述的密码字典生成器就是利用递归算法来实现的。后来又增加了生日密码模式的功能,虽然这个功能很简陋,但也使其功能得以拓展。
递归生成字典函数定义了全局变量来记录字典空间,利用递归算法实现了密码字典的生成。
#include生日字典函数int n=0,l,flag=0; int min,max; char p[10]; print(int n,int l,FILE* pf) { int j; if(n==l) { fprintf(pf,"%sn",p); flag++; return; } for(j=min;j<=max;j++) { p[n]=(char)j; print(n+1,l,pf); } }
简单的闰年判断和月份日期遍历。
printday(int ymin,int ymax,FILE* pf)
{
int y,m,d,dmax;
for(y=ymin;y<=ymax;y++)
{
for(m=1;m <= 12;m++)
{
if(m==4||m==6||m==9||m==11)
dmax=30;
else if(m==2 && ((y%4==0&&y%100!=0)||y%400==0)==1)
dmax=29;
else if(m==2 && ((y%4==0&&y%100!=0)||y%400==0)==0)
dmax=28;
else
dmax=31;
for(d=1;d<=dmax;d++)
{
fprintf(pf,"%04d%02d%02dn",y,m,d);
flag++;
}
}
}
}
主函数
这一部分主要实现了功能的选择以及对一些参数的初始化设置。
int main()
{
int s1,s2;
int ymin,ymax;
FILE* pf = fopen("dict.txt", "w");
printf("请选择字典模式:n");
printf("1:字符串字典 2:生日字典n");
scanf("%d",&s1);
if(s1==1)
{
printf("请输入字符串长度:n");
scanf("%d",&l);
printf("请选择基础字符:n");
printf("1:大写字母 2:小写字母 3:数字n");
scanf("%d",&s2);
if(s2==1)
min=65, max=90;
else if(s2==2)
min=97, max=122;
else
min=48, max=57;
printf("正在执行,请稍候...n");
print(n,l,pf);
}
else
{
printf("请输入初始年份:n");
scanf("%d",&ymin);
printf("请输入终止年份:n");
scanf("%d",&ymax);
printf("正在执行,请稍候...n");
printday(ymin,ymax,pf);
}
printf("执行成功,字典空间为%d",flag);
return 0;
}
运行样例展示



