#include <Windows.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
static int nCount;
// - 递归实现
void TryPwd(char *strPwd, int iCharCount, int iPwdLen)
{
static bool bFirst = false;
static char *ch = new char[iPwdLen+1];
if (!bFirst)
{
ZeroMemory(ch, iPwdLen+1);
bFirst = true;
}
if(0 == iPwdLen)
{
printf("%s\n", ch);
nCount++;
return;
}
for (int j=0; j<iCharCount; j++)
{
ch[iPwdLen-1] = strPwd[j];
TryPwd(strPwd, iCharCount, iPwdLen-1);
}
}
// - 循环实现
void TryPwd2(char* CharMap,DWORD dwCharNum,DWORD dwLens)
{
BYTE pPassBuff[32] = {0};
DWORD* dwIndex = new DWORD[dwLens + 1]; //每个位的计数器,由于最后会溢出一位,所以这里加一
memset(dwIndex,0,sizeof(DWORD) * dwLens);
DWORD i;
do
{
for (DWORD n = 0; n < dwLens; n++)
{
pPassBuff[n] = CharMap[dwIndex[n]];
}
printf("%s\n", pPassBuff);
dwIndex[0] ++; //尾数加一
for (i = 0; (i < dwLens) && (dwIndex[i] == dwCharNum); i++)
{
dwIndex[i] = 0;
dwIndex[i + 1] ++; //进位到下一位
}
} while (i < dwLens);
delete [] dwIndex;
}
int main()
{
char chPwd[] = {'A','B','C'};
int iPwdLen = 3;
TryPwd(chPwd, sizeof(chPwd), iPwdLen); // - 递归实现
TryPwd2(chPwd, sizeof(chPwd), iPwdLen);// - 非递归实现
printf("密码组合数:%d", nCount);
system("pause");
return 0 ;
}
mxn组合的密码破解的两种实现方式代码。第一种版本使用递归方式实现,第二种方式使用循环实现,两个函数的参数列表一样,第一个是组成密码的可能的字符的数组,第二个参数是数组字符个数,即密码中每一位的取值字符种数。第三个参数是密码长度。代码中每一句的作用,请读者自己细细品味。