找回老板的密码

简介:

问题:老板忘了保险箱的密码,他只记得是四位数字,前两个数字相同,后两个数字也相同,并且该数字是一个数的平方,请帮忙找回该老板的密码

对于这个问题,至少有三种解法,因为我只想到了三种:)

下面用php来实现

 

 
 
  1. // 解法一 
  2. function getPwd() 
  3.     $arr = array(); 
  4.     for ($i = 1; $i < 9; $i++) 
  5.     { 
  6.         for ($j = 0; $j < 9; $j++) 
  7.         { 
  8.             $code = sqrt(1100 * $i + 11 * $j); 
  9.             if (ceil($code) == $code
  10.             { 
  11.                 $arr[] = $code * $code
  12.             } 
  13.         } 
  14.     } 
  15.     return $arr
  16.  
  17. $rs = getPwd(); 
  18. print_r($rs); 

算法很简单,一个形如AABB的数,一定是由1100*A + 11*B组成的,如果这个数开方与AB相等,那这个数就是密码。

运行结果:

 
 
  1. Array 
  2.     [0] => 7744 

只有一个,哦也。

虽说是找到密码了,但这个算法却不是最优的。嵌套循环会执行8*9=72次。

执行的时间为:0.0003秒

下面看看算法二:

 
 
  1. // 解法二
  2. function isValid($num
  3.     return $num/1000%10 === $num/100%10 && $num/10%10 === $num%10; 
  4.  
  5. function getPwd() 
  6.     $arr = array(); 
  7.     for($i = 32; $i < 100; $i++) 
  8.     { 
  9.         if (isValid($i * $i)) 
  10.         { 
  11.             $arr[] = $i * $i
  12.         } 
  13.     } 
  14.     return $arr
  15. $rs = getPwd(); 
  16. print_r($rs); 

这个算法比上面的好一些,因为做了预判断,四位数的范围是1000-9999,所以循环的范围就限制到了32*32至100*100,循环次数为68次,执行时间约为0.0002秒

但这还不是最优的,下面看算法三:

 
 
  1. // 算法三 
  2. function isValid($num
  3.     return $num/1000%10 === $num/100%10 && $num/10%10 === $num%10; 
  4.  
  5. function getPwd() 
  6.     $min = floor(sqrt(1100/121)); 
  7.     $max = ceil(sqrt(9999/121)); 
  8.     $arr = array(); 
  9.     for ($i = $min$i < $max$i++) 
  10.     { 
  11.         $code = $i * $i * 121; 
  12.         if (isValid($code)) 
  13.         { 
  14.             $arr[] = $code
  15.         } 
  16.     } 
  17.     return $arr
  18. $rs = getPwd(); 
  19. print_r($rs); 

先看一下执行时间:6.2942504882812E-5,输出结果:

 
 
  1. Array 
  2.     [0] => 7744 

这个算法做了更多的分析,形如AABB的能被11整除并能开方的数也一定能被121整除,于是可以确定循环的范围为1100/121的平方根至9999/121的平方根,取整后的范围为3-10,这意味着只需要循环7次就能找出所有的结果。可见,算法三是这三种算法中效率最高的。










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1030910,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
Linux 数据安全/隐私保护
linux管理员密码找回
linux管理员密码的找回方法
|
算法 安全 Shell
给Git配置SSH后,妈妈再也不担心我忘记输密码了
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 1. 前言 Git 已经成为我们开发最流行的版本控制工具了,Git 支持多种传输协议,其中最常用的就是https 和 ssh,平常我们用 https 比较多,这种方式 pull 和 push 代码都要输入账户密码,非常不方便。
给Git配置SSH后,妈妈再也不担心我忘记输密码了
邮箱搬家(下) -- 员工自助搬家
前面有写过一篇邮箱搬家的教程,试了一下以管理员身份来进行统一的搬家(https://yq.aliyun.com/articles/715978)。不过阿里邮箱共有3种搬家方式,我将另外一种,也是最简单的一种--员工自助搬家,也整理了一下,希望能对大家有用。
2554 0
|
算法 安全 数据安全/隐私保护
A站提醒用户及时修改密码
6月13日,弹幕视频网AcFun公告称,希望用户及时修改密码。
21376 0
|
数据安全/隐私保护 Windows
|
算法 API 数据安全/隐私保护
我是如何找回 Reddit 密码的
本文讲的是我是如何找回 Reddit 密码的,好在我对这一点颇有自知之明。我有意识地筹划生活,所以尽管我跟海洛因上瘾的小白鼠一样不成熟,偶尔还是可以搞定一些事情。
2172 0