穷举法概述(这是引用百度的介绍)
穷举法是一种针对于
密码的破译方法。这种方法很像数学上的“
完全归纳法”并在
密码破译方面得到了广泛的应用。简单来说就是将密码进行逐个推算直到找出真正的密码为止。
比如一个四位并且全部由数字组成其密码共有10000种组合,也就是说最多我们会尝试9999次才能找到真正的密码。利用这种方法我们可以运用计算机来进行逐个推算,也就是说用我们破解任何一个密码也都只是一个时间问题。
当然如果破译一个有8位而且有可能拥有大小写字母、数字、以及
符号的密码用普通的家用电脑可能会用掉几个月甚至更多的时间去计算,其组合方法可能有几千万亿种组合。这样长的时间显然是不能接受的。其解决办法就是运用字典,所谓“字典”就是给密码锁定某个范围,比如英文单词以及生日的数字组合等,所有的英文单词不过10万个左右这样可以大大缩小密码范围,很大程度上缩短了破译时间。
穷举法解题,就是按照某种方式列举问题答案的过程。针对问题的数据类型而言,常用的列举方法一有如下三种:
(1)顺序列举 是指答案范围内的各种情况很容易与自然数对应甚至就是自然数,可以按自然数的变化顺序去列举。
(2)排列列举 有时答案的数据形式是一组数的排列,列举出所有答案所在范围内的排列,为排列列举。
(3)组合列举 当答案的数据形式为一些元素的组合时,往往需要用组合列举。组合是无序的。
例子如下:在公元五世纪我国数学家张丘建在其《算经》一书中提出了“百鸡问题 ”:
这个数学问题的数学方程可列出如下:
Cock+Hen+Chick=100
Cock*5+Hen*3+Chick/3=100
显然这是个不定方程,适用于穷举法求解。依次取Cock值域中的一个值,然后求其他两个数,满足条件就是解。
该问题用java程序算法如下:
Cock = 0;
while (Cock <= 19) /* 公鸡最多不可能大于19 */
{
Hen = 0;
while (Hen <= 33) /* 母鸡最多不可能大于33 */
{
Chick = 100 - Cock - Hen;
if (Cock * 15 + Hen * 9 + Chick == 300)/* 将数量放大三倍比较 这里随着倍数放大答案也会变多*/
System.out.println("\n公鸡=" + Cock + "母鸡=" + Hen + "雏鸡=" + Chick);
Hen = Hen + 1;
}
Cock = Cock + 1;
}
执行结果:
公鸡=0母鸡=25雏鸡=75
公鸡=4母鸡=18雏鸡=78
公鸡=8母鸡=11雏鸡=81
公鸡=12母鸡=4雏鸡=84