找回老板的密码

简介:

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

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

下面用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,如需转载请自行联系原作者
目录
相关文章
|
Java 数据安全/隐私保护 开发者
全球最大同性交友网站的所有用户密码都无法登录!!!
全球最大同性交友网站的所有用户密码都无法登录!!!
291 0
全球最大同性交友网站的所有用户密码都无法登录!!!
|
存储 开发者
心理账户 | 学习笔记
快速学习心理账户。
150 0
心理账户 | 学习笔记
个人邮箱登陆有问题怎么办?
个人邮箱登陆登录地址https://mail.aliyun.com/ 由于阿里云个人邮箱属于免费个人云邮箱,而免费个人云邮箱问题目前不提供工单技术支持,那么一旦个人邮箱登录中遇到问题怎么办呢? 一.可以通过登录页面右上角的“服务中心”自助查询问题解决办法。
18178 0
|
数据安全/隐私保护 Windows
|
算法 API 数据安全/隐私保护
我是如何找回 Reddit 密码的
本文讲的是我是如何找回 Reddit 密码的,好在我对这一点颇有自知之明。我有意识地筹划生活,所以尽管我跟海洛因上瘾的小白鼠一样不成熟,偶尔还是可以搞定一些事情。
2274 0
|
NoSQL 数据安全/隐私保护 智能硬件
|
安全 数据安全/隐私保护
你有忘记密码的经历吗?一招搞定,再也不忘密码!
如何才能安全、方便的管理你的密码呢,今天就向大家推荐一款简单、易用、稳妥的密码管理软件:密码管理精灵,该软件有两大特色: 1、可进行人性化、方便、简单的密码管理。 2、安全,可对所有密码进行加密存放。
1393 0