1. 生成一个长度是3的随机字符串,把这个字符串作为当做密码

  2. 使用穷举法生成长度是3个字符串,匹配上述生成的密码

要求: 分别使用多层for循环 和 递归解决上述问题

1.穷举法:
穷举算法,依赖计算机强大的计算能力,来穷举每一种可能的情况,以达到解决问题的目的,也叫枚举法、暴力破解法。

基本思想———逐一列举问题所涉及的所有情形,并根据问题提出的条件进行检验从而找到可能的解 。

方法步骤———确定枚举对象、枚举范围、判断条件;循环验证每一个解

2.递归:
递归的思想:
以此类推是递归的基本思想。

具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。

递归的两个条件:
可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)
存在一种简单情境,可以使递归在简单情境下退出。(递归出口)

递归三要素:
一定有一种可以退出程序的情况;
总是在尝试将一个问题化简到更小的规模
父问题与子问题不能有重叠的部分
递归:自已(方法)调用自已
例子:用递归把目录下所有的目录及文件全部显示出来

方法一:多层循环方式

package day6;
/** 练习-穷举法破解密码 *    1. 生成一个长度是3的随机字符串,把这个字符串作为当做密码2. 使用穷举法生成长度是3个字符串,匹配上述生成的密码要求: 分别使用多层for循环 和 递归解决上述问题*/
public class TestNumber10 {public static void main(String[] args) {//多层循环方式String password=randomString(3);//首先通过调用randomString()方法随机生成一个字符串作为密码,并将它赋值给passwordSystem.out.println("密码是:"+password);//输出这个密码char[]guesspassword=new char[3];//新建一个长度为3的空数组outloop://设置一个标签,在break的时候使用该标签,即能达到结束多重嵌套循环的效果//开始多层循环,也就是穷举for(short i ='0';i<='z';i++){for(short j ='0';j<='z';j++){for(short k ='0';k<='z';k++){if(!isLetterOrDigit(i,j,k)){//调用isLetterOrDigt()方法,如果i,j,k有一个不符合条件,就跳出当前循环,并开始下一次循环continue;}//如果i,j,k都符合条件,那就分别把i,j,k赋值给guesspassword数组的三个位置guesspassword[0]=(char)i;guesspassword[1]=(char)j;guesspassword[2]=(char)k;//这样就得到了穷举出来的密码String guess = new String(guesspassword);//System.out.println("穷举出来的密码是:"+guess);if(guess.equals(password))//将穷举出来的密码与原密码进行比较,如果二者一致,执行if{System.out.println("找到了,密码是:"+guess);break outloop;}}}}}private static boolean isLetterOrDigit(short i,short j ,short k){//判断i,j,k是不是符合条件return (Character.isLetterOrDigit(i))&&(Character.isLetterOrDigit(j))&&Character.isLetter(k);}private static String randomString(int length){//随机生成一个长度为3的字符串,注意这里有参数Length,是字符串的长度String pool="";for(int i ='0';i<='9';i++){pool+=(char)i;}for(int i ='a';i<='z';i++){pool+=(char)i;}for(int i ='A';i<='Z';i++){pool+=(char)i;}char cs[]=new char[length];//参数传到了这里,也就是new char[3]for(int i =0;i<cs.length;i++){//这样就可以按照cs的长度(也就是password的长度)来随机分配数字或者字母了int index= (int)(Math.random()*(pool.length()));cs[i]=pool.charAt(index);//把字符串随机下标的一个字符放入每一个数组元素}String result = String.valueOf(cs);  //把字符数组转换成字符串,记住return result;}
}

方法二:递归方式

package day6;
/** 练习-穷举法破解密码 *    1. 生成一个长度是3的随机字符串,把这个字符串作为当做密码2. 使用穷举法生成长度是3个字符串,匹配上述生成的密码要求: 分别使用多层for循环 和 递归解决上述问题*/
public class TestNumber11 {public static boolean found = false;public static void main(String[] args) {String password= randomString(3);//定义了一个Password字符串,并调用randomString方法随机生成了一个长度为3的字符串,赋值给了passwordSystem.out.println("密码是:"+password);char[]guessPassword= new char[password.length()];//定义了一个数组guessPassword,她的长度和password的长度一样generatePassword(guessPassword,password);//调用generatePassword方法,注意里面有两个参数}private static void generatePassword(char[]guessPassword,String password){//定义了generatePassword方法,有两个参数generatePassword(guessPassword,0,password);//方法内又调用了generatePassword方法,注意这里是三个参数}private static void generatePassword(char[] guessPassword,int index,String password){//将generatePassword方法重载,改成了三个参数,方法体也有了改变if(found)//这里found如果是false,就不执行if语句,然后继续执行for循环,也就表示false的时候没有找到密码,继续循环;//如果found是true,就代表找到了密码,那么就执行if语句,返回一个空,这里已经有了返回值给generatePassword()方法,那么就不在继续向下执行for循环了,这里要注意。return;for(short i ='0';i<='z';i++){char c =(char)i;//定义一个字符变量c,将i的值赋值给c,并强制类型转换if(!Character.isLetterOrDigit(c))//如果c不符合是字母或者数字的要求,跳出本次循环continue;guessPassword[index]=c;//如果c符合要求,就把c赋值给参入的index参数对应的数组的位置if(index!=guessPassword.length-1){//如果index的值还没有到数组的最后一个位置的值,就继续调用generatePassword//这里index继续向后移动,所以变成里index+1,以此类推generatePassword(guessPassword,index+1,password);}else{//如果index已经到了数组的最后一个位置,就执行else后面这里的方法体String guess = new String(guessPassword);//把guessPassword赋值给定义的字符串guess//System.out.println("穷举出来的密码是:" + guess);if(guess.equals(password)){//比较guess和原密码System.out.println("找到了,密码是" + guess);found =true;//找到了密码。将found改成true,返回空return;}}}}private static String randomString(int length) {//randomString函数的内容:生成长度为3的随机字符串String pool = "";for (short i = '0'; i <= '9'; i++) {pool += (char) i;}for (short i = 'a'; i <= 'z'; i++) {pool += (char) i;}for (short i = 'A'; i <= 'Z'; i++) {pool += (char) i;}char cs[] = new char[length];for (int i = 0; i < cs.length; i++) {int index = (int) (Math.random() * pool.length());cs[i] = pool.charAt(index);}String result = new String(cs);return result;}
}

穷举法破解密码-方法详解相关推荐

  1. 论穷举法破解0到6位数登录密码的可行性

    0到6位数密码含数字,字母大小写,英文符号有537412247190种可能性(千亿数量级),3998.410GB. 在局域网网速,个人台式电脑情况下,java代码(httpclient)访问路由器网址 ...

  2. 穷举法破解集合小游戏~

    游戏网站:http://www.setgame.com/puzzle/set.htm 游戏规则: 1.三种颜色(红.绿.紫) 2.三种外形(方形.椭圆形.花形) 3.三种背景阴影(实心.点.轮廓) 4 ...

  3. C语言七巧板游戏制作,七巧板具体玩法与制作方法详解

    七巧板大家应该都不陌生,这是大家从小到大都接触过的,但是你知道七巧板具体玩法与制作方法吗? 具体玩法 通常,用七巧板拼摆出的图形应当由全部的七块板组成,且板与板之间要有连接,如点的连接.线的连接或点与 ...

  4. 穷举暴力破解密码(真香版)

    最近没事干,本来是准备破解邻居家WiFi密码的,后来发现太慢了,要加载好久,所以自己做了个测试机. 下面是破解器源码: #include<windows.h> #include<io ...

  5. iPhone6手写输入法如何设置 方法详解

    [巴士数码]iPhone支持手写输入法,可能一些新手用户还不清楚iPhone6手写输入法如何设置,下面我们就来介绍一些iPhone6手写输入法的具体设置方法,不知道怎么操作的用户可以来参考一下. iP ...

  6. 台式计算机如何设置三道密码,电脑怎么设置三道开机密码方法详解

    如果我们电脑存有重要的数据或文件资料,那么安全性就成了第一要素,因此我们可以给电脑设置三道密码.下面由小编为你整理了电脑怎么设置三道开机密码的相关方法,希望对你有帮助! 电脑设置三道开机密码的方法 系 ...

  7. 百鸡问题用计算机什么法解决,《穷举法解决问题》教学设计

    一.教学目标 1.知识与技能 ⑴了解穷举法的基本概念及用穷举法设计算法的基本过程. ⑵分析建立正确的数学模型,归纳穷举法穷举技巧. ⑶能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题. 2 ...

  8. 【算法】最直接的算法——穷举法详解

    第三章 穷举法 一.基本概念 穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环. 穷举法依赖的基本技 ...

  9. 算法设计之—直接 遍历/穷举法、贪心算法、动态规划、回溯法、EM方法

    算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法. 无规则方法为穷举,改进方法 ...

  10. python穷举法_python 穷举指定长度的密码例子

    本程序可根据给定的字符字典,穷举指定长度的所有字符串: def get_pwd(str, num): if(num == 1): for x in str: yield x else: for x i ...

最新文章

  1. 观察者设计模式二:回调函数
  2. 【Python-ML】SKlearn库K近邻(KNN) 使用
  3. linux系统取消自检,[转载]取消Linux启动自检
  4. mysql autoenlist默认_mysql连接参数详解
  5. 采用批处理命令对文件进行解压及采用SQLCMD进行数据库挂载
  6. php如何代理yy直播源,财经直播,调用YY直播源
  7. 图像的上采样与下采样
  8. matlab 灰度转伪彩色,matlab将灰度图像伪彩色图像处理(自己编写的color function)...
  9. 人机交互之Web界面设计与CNN大作业
  10. java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation问题解决
  11. 《C Primer Plus第六版》第六章复习题目和编程练习题的答案
  12. 关于mac上的所有东西都变小了
  13. 面试必问之JVM原理 1
  14. 基于卷积神经网络的口罩佩戴识别与检测
  15. G - Gluttonous Goop
  16. 两台电脑共享上网(一台双网卡、一台单网卡)
  17. 信息技术不叫计算机课,信息技术课四要四不要
  18. 选择检测机构,有CNAS认证没CNAS认证区别
  19. [转载] 信息系统项目管理师视频教程——25 战略管理
  20. 岛屿类问题通用解法与DFS框架

热门文章

  1. np.ones用法总结
  2. MODB:软体动物线粒体基因组数据库
  3. 用matlab自动dsolve函数求原函数,matlab中使用dsolve函数求一常微分方程解析解
  4. 关于Tungsten Fabic版本问题,这一篇文章说清了
  5. 服务器空间对SEO的影响有多大
  6. Fedora35安装ibus-rime并配置五笔86方案
  7. 无根树任意根深度加强版
  8. 域管理员与本地管理员密码破解
  9. 全景图怎么拍?相机参数该怎样设置呢?
  10. matlab在脚本中用函数,matlab中脚本和函数的怎么调用